home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / xb / xbstat.has < prev    next >
Encoding:
Text File  |  1996-02-14  |  57.5 KB  |  3,621 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xbstat.has  ……   ぺけ-BASICのステートメント(コンパイラ)
  5. *
  6. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7.  
  8.  
  9.     .include    variable.h
  10.     .include    fefunc.h
  11.  
  12.     .xref    variable_check
  13.     .xref    math解釈
  14.     .xref    error
  15.     .xref    errors
  16.     .xref    warning
  17.     .xref    warnings
  18.     .xref    function_check
  19.     .xref    one_check
  20.     .xref    int定数get
  21.     .xref    fnc書替sub
  22.     .xref    I行数算出
  23.  
  24.     .xref    malloc
  25.     .xref    buf書込
  26.     .xref    buf書込L
  27.     .xref    bufget
  28.     .xref    bufgetL
  29.     .xref    bufput
  30.  
  31.  
  32.  
  33.  
  34.  
  35.     .text
  36.     .even
  37.  
  38.     .xdef    first_check_a5
  39.  * a5 から調べ始める。
  40.  * まず、空白(9,10,13,32)を飛ばして、先頭の文字を見る。
  41.  * 数字(行番号のはず)なら    d0 = 0
  42.  * プログラム終了なら        d0 = -1
  43.  * その他なら            d0 = そのキャラクタ
  44. first_check_a5:
  45. fc_loop:
  46.     moveq    #0,d0
  47.     move.b    (a5),d0
  48.     cmpi.b    #$20,d0
  49.     bhi    fc_loop_out
  50.     beq    fc_next
  51.     cmpi.b    #9,d0
  52.     beq    fc_next
  53.     bcs    @f
  54.     cmpi.b    #$d,d0
  55.     ble    fc_crlf        * $a~$d
  56.     cmpi.b    #$1a,d0
  57.     beq    last
  58.     bra    fc_ret        * おそらく出てくるはずのない ctrl code
  59. @@:
  60.     tst.b    d0
  61.     beq    last
  62.     bra    fc_loop_out
  63. fc_crlf:
  64.     cmpi.b    #$a,d0
  65.     bne    fc_next
  66.     addq.l    #1,行数
  67.  
  68.     btst    #no_cnfF,d7
  69.     beq    fc_next        * 以下、コンフィグ読み込みには関係ない処理
  70.  
  71.     move.l    a0,-(sp)    * else 関係の処理に使うから
  72.  
  73.     move.l    a4,d0
  74.     sub.l    $c+中間言語行数,d0
  75.     move.l    a4,$c+中間言語行数
  76.  * 鎖状のバッファ(size = CbufSIZE * word )を malloc して、d0.w を書き込む
  77.  * d1.w/a0-a1 破壊
  78.     movem.l    d1/a1,-(sp)
  79.     pea.l    中間言語行数
  80.     bsr    buf書込
  81.     addq.l    #4,sp
  82.     movem.l    (sp)+,d1/a1
  83.  
  84. @@:
  85.     movea.l    nest_work,a0
  86.     tst.l    (a0)
  87.     beq    @f
  88.     cmpi.w    #3,8(a0)    * if
  89.     bne    @f
  90.     move.w    10(a0),d0
  91.     btst    #0,d0
  92.     bne    @f
  93.  
  94.     bsr    If_end        * if 文で、改行終わりの時
  95.     bra    @b    * もう一個上にあるかも
  96. @@:
  97.     move.l    (sp)+,a0
  98.  
  99.  
  100.  
  101.  * ここは行の先頭。数字が有ったら行番号だから飛ばす
  102.         addq.l    #1,a5
  103. top_line_loop:
  104.         moveq    #0,d0
  105.         move.b    (a5),d0
  106.         beq    last
  107.         cmpi.b    #32,d0
  108.         bhi    top_line_loop_out
  109.         beq    top_line_cont
  110.         cmpi.b    #9,d0
  111.         beq    top_line_cont
  112.         bcs    fc_ret
  113.         cmpi.b    #13,d0
  114.         ble    fc_crlf        * また改行
  115.         cmpi.b    #$1a,d0
  116.         beq    last
  117.         bra    fc_ret        * おそらく出てくるはずのない ctrl code
  118. top_line_cont:
  119.         addq.l    #1,a5
  120.         bra    top_line_loop
  121.  
  122.  
  123. top_line_loop_out:
  124.         cmpi.b    #'9',d0
  125.         bhi    fc_topret
  126.         cmpi.b    #'0',d0
  127.         bcs    fc_topret
  128.      * 数字だ
  129.         btst    #linenumF,d7
  130.         beq    fc_数字
  131.      * 行番号有り
  132.         move.l    a0,-(sp)
  133.         movea.l    a5,a0
  134.         FPACK    __STOL
  135.         movea.l    a0,a5
  136.         cmpi.l    #$10000,d0
  137.         bcc    不正な行番号
  138.         movem.l    d1/a1,-(sp)
  139.         pea.l    行番号
  140.         bsr    buf書込        * d1.w/a0-a1 破壊
  141.         addq.l    #4,sp
  142.         movem.l    (sp)+,d1/a1
  143.         move.l    (sp)+,a0
  144.  
  145.         move.b    (a5),d0
  146.         cmpi.b    #9,d0
  147.         beq    first_check_a5
  148.         cmpi.b    #32,d0
  149.         beq    first_check_a5
  150.         ERROR    66        * 行番号で切れてない。
  151. 不正な行番号:
  152.         ERROR    79
  153.  
  154. fc_next:
  155.     addq.l    #1,a5
  156.     bra    fc_loop
  157.  
  158.  
  159. fc_loop_out:
  160.     cmpi.b    #'9',d0
  161.     bhi    fc_ret
  162.     cmpi.b    #'0',d0
  163.     bcs    fc_ret
  164.     moveq    #0,d0
  165. fc_ret:
  166.     rts
  167.  
  168. last:
  169.     moveq    #-1,d0
  170.     rts
  171. fc_topret:
  172.     btst    #linenumF,d7
  173.     beq    fc_ret
  174.     WARN    12        * 行番号ない
  175.     rts
  176. fc_数字:
  177.     WARN    13        * 先頭数字
  178.     moveq    #0,d0
  179.     rts
  180.  
  181.  
  182.  
  183.  
  184.  
  185.     .xdef    first_check_a5_in_line
  186. first_check_a5_in_line:
  187.     moveq    #0,d0
  188. fci_loop:
  189.     move.b    (a5),d0
  190.     tst.b    _is_hash(a6,d0.w)    * 流用
  191.     bge    fci_loop_out
  192. fci_next:
  193.     addq.l    #1,a5
  194.     bra    fci_loop
  195.  
  196.  
  197. fci_loop_out:
  198.     cmpi.b    #'9',d0
  199.     bhi    fci_ret
  200.     cmpi.b    #'0',d0
  201.     bcs    fci_ret2
  202.     moveq    #0,d0
  203.     rts
  204.  
  205. fci_ret2:
  206.     cmpi.b    #$1a,d0
  207.     bhi    fci_ret
  208.     beq    lasti
  209.     cmpi.b    #$d,d0
  210.     beq    lasti
  211.     cmpi.b    #$a,d0
  212.     beq    lasti
  213.     tst.b    d0
  214.     bne    fci_ret
  215. lasti:
  216.     moveq    #-1,d0
  217. fci_ret:
  218.     rts
  219.  
  220.  
  221. first_check_a5_remark:
  222.     bsr    first_check_a5
  223.     cmpi.b    #'/',d0
  224.     bne    @f
  225.     cmpi.b    #'*',1(a5)
  226.     bne    @f
  227.     bsr    行末まで飛ばし
  228.     bra    first_check_a5_remark
  229. @@:
  230.     rts
  231.  
  232.  
  233.  * else があるかどうかチェック
  234.  * eq = ある , ne = ない
  235.     .xdef    else_check
  236. else_check:
  237.     bsr    first_check_a5_in_line
  238.     cmpi.b    #'e',(a5)
  239.     bne    @f
  240.     cmpi.b    #'l',1(a5)
  241.     bne    @f
  242.     cmpi.b    #'s',2(a5)
  243.     bne    @f
  244.     cmpi.b    #'e',3(a5)
  245. *    bne    @f
  246. *    addq.w    #4,a5
  247. @@:
  248.     rts
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.     .xdef    行末まで飛ばし
  261. 行末まで飛ばし:
  262.     move.b    (a5)+,d0
  263.     beq    @f
  264.     cmpi.b    #$a,d0
  265.     bne    行末まで飛ばし
  266. @@:
  267.     subq.l    #1,a5
  268.     rts
  269.  
  270.  
  271.  
  272.  
  273.  
  274.     .xdef    make_hash_istable
  275. make_hash_istable:
  276.     lea.l    $100+_is_hash(a6),a0
  277.     move.w    #$ff,d1
  278.     moveq    #1,d0
  279. 3:
  280.     cmpi.b    #'$',d1
  281.     beq    @f
  282.     cmpi.b    #'0',d1
  283.     bcs    2f
  284.     cmpi.b    #'9',d1
  285.     bls    @f
  286.     cmpi.b    #'A',d1
  287.     bcs    2f
  288.     cmpi.b    #'Z',d1
  289.     bls    @f
  290.     cmpi.b    #'_',d1
  291.     beq    @f
  292.     cmpi.b    #'a',d1
  293.     bcs    2f
  294.     cmpi.b    #'z',d1
  295.     bls    @f
  296.     bra    2f
  297. @@:
  298.     clr.b    -(a0)
  299.     bra    4f
  300. 2:
  301.     move.b    d0,-(a0)    * d0 = +1
  302. 4:
  303.     dbra    d1,3b
  304.  
  305. *    moveq    #-1,d1        *
  306.     move.b    d1,9(a0)
  307.     move.b    d1,32(a0)
  308.     rts
  309.  
  310.  
  311.  
  312.  * ハッシュ値を計算しながら、文字数を数える
  313.  * a2.l = 元の対象の開始アドレス
  314.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  315.  * d4.w = 文字数 - 1
  316.  * d1.b = お次の文字 (  (,[,=,:, , etc... TAB,SPC 以外 )
  317.  * ( ここに書いてあるもの以外を壊してはいけない )
  318.     .xdef    hash
  319. hash:
  320.     movea.l    a5,a2
  321.     moveq    #0,d5
  322.     moveq    #0,d1
  323.     moveq    #0,d4
  324. hloop:
  325.     move.b    (a5)+,d1
  326.     tst.b    _is_hash(a6,d1.w)
  327.     beq    @f    * 英数字、$、_
  328.     bgt    h_end
  329.     bra    h_space
  330.  
  331. @@:
  332.     rol.w    #2,d5        * ハッシュ値計算(6/11/4 現在)
  333.     eor.w    d1,d5
  334.     addq.w    #1,d4
  335.     bra    hloop
  336.  
  337. h_space:
  338.     move.b    (a5)+,d1
  339.     tst.b    _is_hash(a6,d1.w)
  340.     bmi    h_space
  341. h_end:
  342.     subq.l    #1,a5
  343.     subq.w    #1,d4
  344.     swap    d4
  345.     move.w    d5,d4
  346.     swap    d4    * (hash.w)(文字数-1)
  347.     rts
  348.  
  349.  
  350.  
  351.     .xdef    hash_label特別
  352. hash_label特別:
  353.     movea.l    a5,a2
  354.     moveq    #0,d5
  355.     moveq    #0,d1
  356.     moveq    #0,d4
  357. hloop_lt:
  358.     move.b    (a5)+,d1
  359.     cmpi.b    #'"',d1
  360.     bhi    @f
  361.     beq    h_end_lt
  362.     cmpi.b    #$20,d1
  363.     bcs    label_err
  364. @@:
  365.     rol.w    #2,d5        * ハッシュ値計算(6/11/4 現在)
  366.     eor.w    d1,d5
  367.     addq.w    #1,d4
  368.     bra    hloop_lt
  369.  
  370. h_space_lt:
  371.     move.b    (a5)+,d1
  372.     tst.b    _is_hash(a6,d1.w)
  373.     bmi    h_space_lt
  374. h_end_lt:
  375.     subq.l    #1,a5
  376.     subq.w    #1,d4
  377.     swap    d4
  378.     move.w    d5,d4
  379.     swap    d4    * (hash.w)(文字数-1)
  380.     rts
  381.  
  382. label_err:
  383.     ERROR    82
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  * (a2) から始まる名前(d4.w = 長さ - 1)を登録し、アドレスを a0 に返す。
  390.     .xdef    名前登録
  391. 名前登録:
  392.     move.w    d0,-(sp)
  393.     movea.l    名前,a0
  394.     move.w    4+名前,d0
  395. @@:
  396.     sub.w    d4,d0
  397.     subq.w    #1,d0
  398.     bge    @f
  399.     move.w    #$400,d0
  400.     bsr    malloc
  401.     bra    @b
  402. @@:
  403.  
  404.     move.l    a0,-(sp)
  405. @@:
  406.     move.b    (a2)+,(a0)+
  407.     dbra    d4,@b
  408. *    clr.b    (a0)+        * いらないけど一応気持ち
  409.     move.l    a0,名前
  410.     move.w    d0,4+名前
  411.     movea.l    (sp)+,a0
  412.     move.w    (sp)+,d0
  413.     rts
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  * 対象がどれかステートメントと一致するかどうか
  421.  * a2.l = 元の対象の開始アドレス
  422.  * d5.w = ハッシュ値
  423.  * d4.w = 文字数 - 1
  424.  
  425.  * 一致すれば        d0 = そのステートメント番号
  426.  * 一致しなければ    d0 = 0
  427.     .xdef    statement_check
  428. statement_check:
  429.     moveq    #0,d0
  430.     move.b    d5,d0    * ハッシュ値の下位バイトで見当を付ける
  431.     move.b    stat_hash_table(pc,d0.w),d0
  432.     bne    sc_本格check
  433.     rts
  434.  
  435.     * ステートメント用のハッシュ値テーブル (1対1対応)
  436. stat_hash_table:
  437.     .dc.b    $23,$00,$00,$00,$00,$00,$00,$00,$20,$00,$00,$27,$0C,$00,$0A,$00
  438.     .dc.b    $15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  439.     .dc.b    $1A,$1C,$00,$00,$00,$00,$00,$00,$00,$28,$00,$07,$00,$00,$00,$00
  440.     .dc.b    $00,$00,$00,$00,$11,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08
  441.     .dc.b    $00,$00,$00,$00,$1D,$21,$17,$00,$00,$00,$00,$00,$1F,$00,$00,$00
  442.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14,$24,$1B,$00,$00
  443.     .dc.b    $00,$00,$00,$00,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0E,$00
  444.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$29,$00,$00,$00,$00,$00
  445.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$22,$00,$00,$13,$00,$00,$18
  446.     .dc.b    $00,$00,$26,$00,$00,$00,$00,$00,$2a,$00,$00,$00,$00,$0D,$00,$00
  447.     .dc.b    $00,$1E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$16,$00
  448.     .dc.b    $00,$00,$00,$00,$00,$00,$25,$00,$06,$00,$00,$00,$00,$00,$00,$00
  449.     .dc.b    $00,$00,$19,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$00
  450.     .dc.b    $00,$00,$00,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$05,$04,$00,$00
  451.     .dc.b    $00,$00,$02,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  452.     .dc.b    $00,$00,$00,$12,$00,$00,$00,$0F,$00,$00,$00,$00,$00,$00,$00,$00
  453.  
  454. sc_本格check:
  455.     move.w    d0,d2
  456.     lsl.w    #2,d2
  457.     cmp.w    stat(pc,d2.w),d4
  458.     bne    sc_該当無し
  459.     move.w    2+stat(pc,d2.w),d2
  460.     lea.l    stat(pc,d2.w),a0
  461.     move.l    a2,a1
  462.     move.w    d4,d2
  463. @@:
  464.     cmp.b    (a1)+,(a0)+
  465.     dbne    d2,@b
  466.     beq    sc_ok
  467. sc_該当無し:
  468.     moveq    #0,d0
  469. sc_ok:
  470.     rts
  471.  
  472. stat:
  473.     .dc.w    s01-s00-2,s00-stat    * dummy
  474.     .dc.w    s02-s01-2,s01-stat
  475.     .dc.w    s03-s02-2,s02-stat
  476.     .dc.w    s04-s03-2,s03-stat
  477.     .dc.w    s05-s04-2,s04-stat
  478.     .dc.w    s06-s05-2,s05-stat
  479.     .dc.w    s07-s06-2,s06-stat
  480.     .dc.w    s08-s07-2,s07-stat
  481.     .dc.w    s09-s08-2,s08-stat
  482.     .dc.w    s10-s09-2,s09-stat
  483.     .dc.w    s11-s10-2,s10-stat
  484.     .dc.w    s12-s11-2,s11-stat
  485.     .dc.w    s13-s12-2,s12-stat
  486.     .dc.w    s14-s13-2,s13-stat
  487.     .dc.w    s15-s14-2,s14-stat
  488.     .dc.w    s16-s15-2,s15-stat
  489.     .dc.w    s17-s16-2,s16-stat
  490.     .dc.w    s18-s17-2,s17-stat
  491.     .dc.w    s19-s18-2,s18-stat
  492.     .dc.w    s20-s19-2,s19-stat
  493.     .dc.w    s21-s20-2,s20-stat
  494.     .dc.w    s22-s21-2,s21-stat
  495.     .dc.w    s23-s22-2,s22-stat
  496.     .dc.w    s24-s23-2,s23-stat
  497.     .dc.w    s25-s24-2,s24-stat
  498.     .dc.w    s26-s25-2,s25-stat
  499.     .dc.w    s27-s26-2,s26-stat
  500.     .dc.w    s28-s27-2,s27-stat
  501.     .dc.w    s29-s28-2,s28-stat
  502.     .dc.w    s30-s29-2,s29-stat
  503.     .dc.w    s31-s30-2,s30-stat
  504.     .dc.w    s32-s31-2,s31-stat
  505.     .dc.w    s33-s32-2,s32-stat
  506.     .dc.w    s34-s33-2,s33-stat
  507.     .dc.w    s35-s34-2,s34-stat
  508.     .dc.w    s36-s35-2,s35-stat
  509.     .dc.w    s37-s36-2,s36-stat
  510.     .dc.w    s38-s37-2,s37-stat
  511.     .dc.w    s39-s38-2,s38-stat
  512.     .dc.w    s40-s39-2,s39-stat
  513.     .dc.w    s41-s40-2,s40-stat
  514.     .dc.w    s42-s41-2,s41-stat
  515.     .dc.w    s43-s42-2,s42-stat
  516.  
  517.  
  518.  
  519. st:
  520. * ステートメント
  521. s00:    *dummy
  522. s01:    .dc.b    'color',0
  523. s02:    .dc.b    'console',0
  524. s03:    .dc.b    'locate',0
  525. s04:    .dc.b    'lprint',0
  526. s05:    .dc.b    'print',0
  527. s06:    .dc.b    'width',0
  528. s07:    .dc.b    'screen',0
  529.  
  530. s08:    .dc.b    'break',0
  531. s09:    .dc.b    'case',0
  532. s10:    .dc.b    'continue',0
  533. s11:    .dc.b    'default',0
  534. s12:    .dc.b    'endfunc',0
  535. s13:    .dc.b    'endswitch',0
  536. s14:    .dc.b    'error',0
  537. s15:    .dc.b    'return',0
  538. s16:    .dc.b    'switch',0
  539. s17:    .dc.b    'beep',0
  540. s18:    .dc.b    'cls',0
  541. s19:    .dc.b    'end',0
  542. s20:    .dc.b    'endwhile',0
  543. s21:    .dc.b    'exit',0
  544. s22:    .dc.b    'for',0
  545. s23:    .dc.b    'gosub',0
  546. s24:    .dc.b    'goto',0
  547. s25:    .dc.b    'if',0
  548. s26:    .dc.b    'input',0
  549. s27:    .dc.b    'key',0
  550. s28:    .dc.b    'linput',0
  551. s29:    .dc.b    'next',0
  552. s30:    .dc.b    'repeat',0
  553. s31:    .dc.b    'stop',0
  554. s32:    .dc.b    'until',0
  555. s33:    .dc.b    'while',0
  556.  
  557. s34:    .dc.b    'dim',0
  558. s35:    .dc.b    'float',0
  559. s36:    .dc.b    'int',0
  560. s37:    .dc.b    'char',0
  561. s38:    .dc.b    'str',0
  562.  
  563. s39:    .dc.b    'func',0
  564.  
  565. s40:    .dc.b    'else',0
  566. s41:    .dc.b    'then',0
  567. s42:    .dc.b    'label',0
  568. s43:
  569.     .dc.b    0
  570.     .even
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  * 各ステートメントごとに文法が違うのでいちいち異なる解釈をしなければ
  577.  * d0 = statment #.
  578.     .xdef    stat解釈
  579. stat解釈:
  580.     move.w    d0,d2
  581.     add.w    d2,d2
  582.     move.w    stt(pc,d2.w),d0
  583.     jmp    stt(pc,d0.w)
  584. stt:
  585.     .dc.w    0        * dummy
  586.     .dc.w    Color-stt
  587.     .dc.w    Console-stt
  588.     .dc.w    Locate-stt
  589.     .dc.w    Lprint-stt
  590.     .dc.w    Print-stt
  591.     .dc.w    Width-stt
  592.     .dc.w    Screen-stt
  593.     .dc.w    Break-stt
  594.     .dc.w    Case-stt
  595.     .dc.w    Continue-stt        *10
  596.     .dc.w    Default-stt
  597.     .dc.w    Endfunc-stt
  598.     .dc.w    Endswitch-stt
  599.     .dc.w    Error-stt
  600.     .dc.w    Return-stt
  601.     .dc.w    Switch-stt
  602.     .dc.w    Beep-stt
  603.     .dc.w    Cls-stt
  604.     .dc.w    End-stt
  605.     .dc.w    Endwhile-stt        *20
  606.     .dc.w    Exit-stt
  607.     .dc.w    For-stt
  608.     .dc.w    Gosub-stt
  609.     .dc.w    Goto-stt
  610.     .dc.w    If-stt
  611.     .dc.w    Input-stt
  612.     .dc.w    Key-stt
  613.     .dc.w    Linput-stt
  614.     .dc.w    Next-stt
  615.     .dc.w    Repeat-stt        *30
  616.     .dc.w    Stop-stt
  617.     .dc.w    Until-stt
  618.     .dc.w    While-stt
  619.     .dc.w    Dim-stt
  620.     .dc.w    Float-stt    * 35
  621.     .dc.w    Int-stt
  622.     .dc.w    Char-stt
  623.     .dc.w    Str-stt
  624.     .dc.w    Func-stt
  625.     .dc.w    Else-stt        *40
  626.     .dc.w    Then-stt
  627.  
  628.  
  629.  
  630.  
  631. Gosub:
  632.     ERRORS    3    * 未サポート
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639. Goto:
  640.     move.w    d2,(a4)+        * 中間言語書き込み
  641.  
  642.     pea.l    goto飛先
  643.  
  644.     move.b    (a5),d0
  645.     cmpi.b    #'9',d0
  646.     bhi    goto_err
  647.     cmpi.b    #'0',d0
  648.     bcc    Goto番号
  649.     btst    #labelF,d7
  650.     beq    goto_err
  651.     cmpi.b    #'"',d0
  652.     beq    label_quote
  653.     cmpi.b    #'*',d0
  654.     bne    goto_err
  655.  
  656. label_star:
  657.     addq.l    #1,a5
  658.     bsr    hash
  659.     bsr    label_sub    * d0 = label #
  660.     not.l    d0
  661.     bsr    buf書込L
  662.     bra    @f
  663. label_quote:
  664.     addq.l    #1,a5
  665.     bsr    hash_label特別
  666.     bsr    label_sub    * d0 = label #
  667.     cmpi.b    #'"',(a5)+
  668.     bne    label_quote_err
  669.     not.l    d0
  670.     bsr    buf書込L
  671.     bra    @f
  672. label_quote_err:
  673.     ERROR    82
  674.  
  675. Goto番号:
  676.         btst    #linenumF,d7
  677.         beq    行番号無しにgoto
  678.         movea.l    a5,a0
  679.         FPACK    __STOL            * 行番号
  680.         movea.l    a0,a5
  681.         cmpi.l    #$10000,d0
  682.         bcc    不正な行番号
  683.         bsr    buf書込L
  684. @@:
  685.     move.l    a4,d0            * 飛び先書き込みアドレス
  686.     bsr    buf書込L        * d1.w/a0-a1 破壊
  687. *    addq.l    #4,a4
  688.     move.l    #4,(a4)+        * とりあえず安全策
  689.  
  690.     addq.l    #4,sp
  691.     rts
  692.  
  693. 行番号無しにgoto:
  694.     ERROR    78
  695. goto_err:
  696.     ERROR    80
  697.  
  698.  
  699.  
  700.  
  701.     .xdef    label_sub
  702. label_sub:
  703. *    bsr    hash
  704.     bsr    label_check
  705.     tst.w    d1
  706.     bge    1f
  707.         move.w    8+ラベル,d1
  708.         addq.w    #1,d1
  709.         lsr.w    #3,d1        * label 番号
  710.  
  711.         move.l    d1,-(sp)
  712.         pea.l    ラベル
  713.         move.l    d4,d0
  714.         bsr    buf書込L
  715.         bsr    名前登録    * a2,d4 破壊
  716.         move.l    a0,d0        * 名前アドレス
  717.         bsr    buf書込L
  718.         moveq    #-1,d0
  719.         bsr    buf書込L    * 行数(-1 = 未登録)
  720.         bsr    buf書込L    * (空き)
  721.         addq.l    #4,sp
  722.         move.l    (sp)+,d1
  723. 1:
  724.     moveq    #0,d0
  725.     move.w    d1,d0
  726.     rts
  727.  
  728.  
  729.  
  730. label_check:
  731.     move.w    8+ラベル,d3
  732.     addq.w    #1,d3
  733.     lsr.w    #3,d3        * label 個数
  734.     subq.w    #1,d3
  735.     bmi    label_check_end
  736.     movea.l    4+ラベル,a3
  737.     moveq    #CbufSIZE/8,d2
  738.     moveq    #0,d1
  739. label_check_loop:
  740.     cmp.l    (a3),d4
  741.     bne    label_check_cont
  742.         movea.l    4(a3),a0    * 名前
  743.         movea.l    a2,a1
  744.         move.w    d4,d0
  745. @@:
  746.         cmp.b    (a0)+,(a1)+
  747.         dbne    d0,@b
  748.         beq    label_check_ok
  749.  
  750. label_check_cont:
  751.     lea.l    $10(a3),a3
  752.     addq.w    #1,d1
  753.     subq.w    #1,d2
  754.     dbeq    d3,label_check_loop
  755.     bne    label_check_end
  756.     movea.l    (a3),a3
  757.     moveq    #CbufSIZE/8,d2
  758.     dbra    d3,label_check_loop
  759. label_check_end:
  760.     moveq    #-1,d1
  761. label_check_ok:
  762.     rts
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.     .xdef    Goto整理
  771. Goto整理:
  772.     movem.l    d0-d4/a0-a3,-(sp)
  773.  
  774.     move.w    8+goto飛先,d4
  775.     addq.w    #1,d4
  776.     lsr.w    #2,d4        * goto 文の個数
  777.     subq.w    #1,d4
  778.     bmi    Goto整理_end
  779.     movea.l    4+goto飛先,a3
  780.     moveq    #CbufSIZE/4,d3
  781. Goto整理_loop:
  782.     move.l    (a3)+,d2    * 行番号
  783.     bge    @f
  784.     not.l    d2        * ラベル番号
  785.     move.w    d2,d1
  786.     lsl.w    #3,d1
  787.     addq.w    #4,d1        * 行数の格納位置
  788.  
  789.     move.l    a3,-(sp)
  790.     movea.l    4+ラベル,a3
  791.     bsr    bufgetL        * ラベルのさすアドレス
  792.     move.l    (sp)+,a3
  793.     movea.l    d0,a1
  794.     bra    1f
  795. @@:
  796.     bsr    行番号to行数
  797.     tst.w    d1
  798.     bmi    行番号該当無し
  799.     bsr    行数toADDRESS
  800. 1:
  801.     movea.l    (a3)+,a0    * 飛び先書き込みアドレス
  802.     bsr    goto_block_check
  803.     suba.l    a0,a1
  804.     move.l    a1,(a0)
  805.  
  806.     subq.w    #1,d3
  807.     dbeq    d4,Goto整理_loop
  808.     bne    Goto整理_end
  809.     movea.l    (a3),a3
  810.     moveq    #CbufSIZE/4,d3
  811.     dbra    d4,Goto整理_loop
  812.  
  813. Goto整理_end:
  814.     movem.l    (sp)+,d0-d4/a0-a3
  815.     rts
  816.  
  817. 行番号該当無し:
  818.     movea.l    (a3)+,a5    * 飛び先書き込みアドレス
  819.     bsr    I行数算出
  820.     ERROR    78
  821.  
  822.  
  823.  * goto=a0 と 飛び先=a1 の間に func がないかどうか
  824. goto_block_check:
  825.     movem.l    d5/a0/a1/a3,-(sp)
  826.     move.w    内部関数個数,d5
  827.     bmi    1f
  828.     movea.l    内部関数buf,a3
  829.     cmpa.l    a1,a0
  830.     bcs    @f
  831.     exg    a0,a1        * a0<a1
  832.  
  833. @@:
  834.     lea.l    $c(a3),a3
  835.     move.l    (a3)+,d0    * func
  836.     cmp.l    a1,d0
  837.     bcc    1f
  838.     cmp.l    a0,d0
  839.     bcc    2f
  840.     dbra    d5,@b
  841. 1:
  842.     movem.l    (sp)+,d5/a0/a1/a3
  843.     rts
  844. 2:
  845.     movem.l    (sp)+,d5/a0/a1/a3
  846.     movea.l    a0,a5        * 飛び先書き込みアドレス
  847.     bsr    I行数算出
  848.     ERROR    83    * 関数ブロックの外に飛び出した
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  * d1 = 行数 ( 1,2,3,...) to  a1 = ADDRESS
  856. 行数toADDRESS:
  857.     movem.l    d3/a3,-(sp)
  858.     move.w    d1,d3
  859.     subq.w    #1,d3
  860.     moveq    #0,d1
  861.     movea.l    4+中間言語行数,a3
  862.     move.l    中間言語,a1
  863. @@:
  864.     bsr    bufget
  865.     adda.w    d0,a1
  866.     addq.w    #1,d1
  867.     dbra    d3,@b
  868.     movem.l    (sp)+,d3/a3
  869.     rts
  870.  
  871.  
  872.  * d2 = 行番号  to  d1 = 行数 ( 1,2,3,...), =-1 なし
  873. 行番号to行数:
  874.     movem.l    d3/a3,-(sp)
  875.     moveq    #0,d1
  876.     move.w    8+行番号,d3
  877.     movea.l    4+行番号,a3
  878. @@:
  879.     bsr    bufget
  880.     addq.w    #1,d1
  881.     cmp.w    d2,d0
  882.     dbeq    d3,@b
  883.     beq    @f
  884.     moveq    #-1,d1
  885. @@:
  886.     movem.l    (sp)+,d3/a3
  887.     rts
  888.  
  889.  
  890.  
  891.  
  892.  
  893. **    **    **
  894.  *    内部関数関係のステートメントの処理
  895.  
  896.  
  897.     .xdef    Return
  898. Return:
  899.     tst.b    d7
  900.     bpl    funcがない
  901.  
  902.     cmpi.b    #'(',(a5)
  903.     bne    _no_ret_dat2
  904.  
  905.     addq.l    #1,a5
  906.     bsr    first_check_a5_in_line
  907.     cmpi.b    #')',d0
  908.     beq    _no_ret_dat
  909.  
  910.     move.w    d2,(a4)+        * 中間言語書き込み
  911.  
  912.     move.w    RETURNtype,d2
  913.     move.w    d2,(a4)+        * 中間言語書き込み
  914.  
  915.     lsl.w    #8,d2
  916.     movea.l    a4,a3
  917.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  918.  * int        d2.w    = 0000
  919.  * str        d2.w    = 0100
  920.  * float    d2.w    = 8000
  921.     bsr    math解釈
  922.     movea.l    a3,a4
  923.  
  924.     cmpi.b    #')',(a5)+
  925.     bne    err_return
  926.     rts
  927.  
  928. err_return:
  929.     ERROR    50
  930.  
  931. _no_ret_dat:
  932.     addq.l    #1,a5
  933. _no_ret_dat2:
  934.     tst.w    RETURNtype
  935.     bne    返り値がない
  936.     move.w    #$0c*2,(a4)+        * 中間言語書き込み'endfunc'$$$
  937.     clr.w    (a4)+            * 中間言語書き込み (int)
  938.     rts
  939.  
  940. 返り値がない:
  941.     ERROR    49
  942.  
  943.  
  944. Endfunc:
  945.     tst.b    d7
  946.     bpl    funcがない
  947.     bset    #endfuncF,d7
  948.     bne    funcがない
  949.  
  950.     movea.l    nest_work,a0
  951.     tst.l    (a0)
  952.     bne    nest_structure終わってない
  953.  
  954.     move.w    d2,(a4)+        * 中間言語書き込み
  955.     move.w    RETURNtype,(a4)+
  956.  
  957.     bsr    auto変数リスト作成
  958.     rts
  959.  
  960. funcがない:
  961.     ERROR    45
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968.     .xdef    Func
  969. Func:
  970.     bset    #modeF,d7        * auto
  971.     bne    内部関数あり
  972.  
  973.  * global
  974.     movea.l    nest_work,a0
  975.     tst.l    (a0)
  976.     bne    nest_structure終わってない
  977.  
  978.     move.w    d2,(a4)+        * 中間言語書き込み
  979.     bsr    global変数リスト作成
  980.     bra    @f
  981.  
  982. 内部関数あり:
  983.     bclr    #endfuncF,d7
  984.     beq    no_endfunc
  985. @@:
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  * 型を得る(省略なら int )
  992.     bsr    型get            * すでにわかっている(はず)
  993.  
  994.     bsr    first_check_a5_in_line
  995.  * ハッシュ値を計算しながら、文字数を数える
  996.     bsr    hash
  997.  * a2.l = 元の対象の開始アドレス
  998.  * d4.l = (hash.w)(文字数-1)
  999.     tst.w    d4
  1000.     bmi    sonnahazunai
  1001.     bsr    function_check
  1002.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  1003.  * d0.w < 0 の時
  1004.  *    d1.w = 引き数の個数
  1005.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数 )
  1006.  *    a2   = パラメーターテーブル
  1007.     tst.w    d0
  1008.     beq    sonnahazunai
  1009.     not.w    d3
  1010.     bmi    sonnahazunai
  1011.  
  1012.     lsl.w    #4,d3
  1013.     movea.l    内部関数buf,a3
  1014.     adda.w    d3,a3
  1015.     move.l    a4,$c(a3)        * 実行アドレス
  1016.  
  1017.  
  1018. *    movem.l    変数INIT,a0/a1
  1019. *    sub.l    a1,a0
  1020.     move.w    8+変数INIT,d0
  1021.     addq.w    #1,d0
  1022.     add.w    d0,d0
  1023.     move.w    d0,(a4)+    * 変数 area を初期化する時の参照するオフセット
  1024.     move.w    8+引数INIT,d0
  1025.     addq.w    #1,d0
  1026.     add.w    d0,d0
  1027.     move.w    d0,(a4)+    * 引き数を取り込む時、参照するオフセット
  1028.  
  1029. *    movea.l    引数INIT,a1
  1030. *    subq.w    #1,d1
  1031. *    move.w    d1,(a1)+
  1032. *    move.l    a1,引数INIT
  1033.     pea.l    引数INIT
  1034.     move.w    d1,d0
  1035.     subq.w    #1,d0        * 引き数の個数 - 1
  1036.     bsr    buf書込        * d1.w/a0-a1 破壊
  1037.     addq.l    #4,sp
  1038.  
  1039.  
  1040.  
  1041.  
  1042.     moveq    #-1,d0        * 登録された個数 - 1
  1043.     move.w    d0,4+AUTOint
  1044.     move.w    d0,4+AUTOstr
  1045.     move.w    d0,4+AUTOchar
  1046.     move.w    d0,4+AUTOfloat
  1047.     move.w    d0,4+AUTO配列
  1048.  
  1049.  
  1050.     cmpi.b    #'(',(a5)+
  1051.     bne    sonnahazunai
  1052.  
  1053. func_loop:
  1054.     bsr    first_check_a5_in_line
  1055.     move.w    (a2)+,d0
  1056.     bge    @f
  1057.     cmpi.w    #$8080,d0    * 拡張配列印
  1058.     bne    func_loop_end
  1059. @@:
  1060.     move.l    a2,-(sp)
  1061.     move.w    d0,-(sp)
  1062.  
  1063.  
  1064.  * 引き数名のチェック
  1065.     bsr    hash        * 引き数名
  1066.     bsr    statement_check
  1067.     tst.w    d0
  1068.     bne    var_def_err
  1069.  
  1070.  *        d4.l = * (hash.w)(文字数-1)
  1071.  *        a2.l = 元の対象の開始アドレス
  1072.     bsr    function_check
  1073.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  1074.     tst.w    d0
  1075.     bne    var_double_def_err    * 関数と同じ名前
  1076.  
  1077.  
  1078.  * 他の変数名と重なってないかどうか
  1079.  *         d4.l = * (hash.w)(文字数-1)
  1080.  *         a2.l = 元の対象の開始アドレス
  1081.      bsr    variable_check
  1082.  * 重なってない        d2.l    = -1
  1083.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  1084.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  1085.  * char の n 番と一致    d2.l    = n+0200
  1086.  * float の n 番と一致    d2.l    = n+8000
  1087.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  1088.  * d0 =   0 : 普通の変数
  1089.  *      1 : 配列    ( a0 = その配列情報のポインタ )
  1090.  *    $80 : auto 変数
  1091.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ )
  1092.  *     -1 : 当たりなし
  1093.     bmi    @f        * 当たりなし、global のみのとき定義出来る
  1094.     tst.b    d0
  1095.     bmi    var_double_def_err
  1096.  
  1097. @@:
  1098.     move.w    (sp)+,d2        * 型
  1099.     cmpi.w    #$8080,d2    * 拡張配列印
  1100.     beq    2f
  1101.     moveq    #$60,d0        * 配列印
  1102.     and.w    d2,d0
  1103.     beq    @f
  1104. 2:
  1105.         bsr    配列引き数登録
  1106.         bra    1f
  1107. @@:
  1108.         bsr    変数引き数登録
  1109. 1:
  1110.  
  1111.     cmpi.b    #';',(a5)
  1112.     bne    @f
  1113.  
  1114.     addq.l    #1,a5
  1115.     bsr    hash        * 変数の型だが、無視
  1116. @@:
  1117.     movea.l    (sp)+,a2
  1118.  
  1119.     bsr    first_check_a5_in_line
  1120.     addq.l    #1,a5
  1121.     cmpi.b    #',',d0
  1122.     beq    func_loop
  1123.     cmpi.b    #')',d0
  1124.     bne    sonnahazunai
  1125.     move.w    (a2)+,d0
  1126.     bge    sonnahazunai
  1127.     bra    @f
  1128.  
  1129. func_loop_end:
  1130.     cmpi.b    #')',(a5)+
  1131.     bne    sonnahazunai
  1132.  
  1133.  
  1134. @@:
  1135.     subi.w    #$8000,d0
  1136.     beq    float_rt
  1137.     subq.w    #1,d0
  1138.     beq    int_rt
  1139.     subq.w    #1,d0
  1140.     beq    char_rt
  1141.     subq.w    #1,d0
  1142.     bne    sonnahazunai
  1143.     moveq    #1,d0
  1144.     bra    @f
  1145. float_rt:
  1146.     move.w    #$0080,d0
  1147.     bra    @f
  1148. char_rt:
  1149.     moveq    #$0002,d0
  1150.     bra    @f
  1151. int_rt:
  1152. @@:
  1153.     move.w    d0,RETURNtype         * d0 = 返り値の型
  1154.  
  1155.     rts
  1156.  
  1157.  
  1158. 配列引き数登録:
  1159.     move.w    d2,-(sp)
  1160.     lea.l    AUTO配列,a0    * 当たり前だが auto
  1161.     moveq    #5,d1        * 一項辺りのデータサイズ ( = 2^5 = 32 )
  1162.     bsr    変数登録sub    * 配列登録 (d2= -変数番号) (d4もういらない)
  1163.  
  1164.     move.w    (sp)+,d0    * 型
  1165.     cmpi.w    #$8080,d0
  1166.     bne    @f
  1167.  
  1168.     movea.l    4(sp),a0    * 引き数情報ポインタ
  1169.     move.w    (a0)+,d0    * 型+次元-1
  1170.     clr.w    d1
  1171.     move.b    d0,d1
  1172.     clr.b    d0
  1173.     move.w    d1,d4
  1174.     add.w    d4,d4
  1175.     lea.l    4(a0,d4.w),a0
  1176.     move.l    a0,4(sp)
  1177.     bra    1f
  1178.  
  1179. @@:
  1180.     moveq    #0,d1    * 1-dim
  1181.     btst    #6,d0
  1182.     beq    @f
  1183.     moveq    #1,d1    * 2-dim
  1184. @@:
  1185.     btst    #0,d0
  1186.     bne    float引き数D
  1187.     btst    #1,d0
  1188.     bne    int引き数D
  1189.     btst    #2,d0
  1190.     bne    char引き数D
  1191.     btst    #3,d0
  1192.     bne    str引き数D
  1193.     bra    sonnahazunai
  1194.  
  1195. float引き数D:
  1196.     move.w    #$8000,d0
  1197.     bra    1f
  1198. char引き数D:
  1199.     move.w    #$0200,d0
  1200.     bra    1f
  1201. str引き数D:
  1202.     move.w    #$0100,d0
  1203.     bra    1f
  1204. int引き数D:
  1205.     move.w    #$0000,d0
  1206.  
  1207. 1:
  1208.     move.w    d0,(a3)+    * 型
  1209.     move.w    d1,(a3)+    * 次元 - 1
  1210.     move.w    d1,-(sp)
  1211.     subq.w    #1,d1
  1212.     bcs    2f
  1213. 3:
  1214.     cmpi.b    #',',(a5)+
  1215.     bne    3b
  1216.     clr.w    (a3)+        * 変数領域大きさ計算用に添字大きさクリア
  1217.     dbra    d1,3b
  1218. 2:
  1219.     clr.w    (a3)+        * 変数領域大きさ計算用に添字大きさクリア
  1220.     cmpi.b    #')',(a5)+
  1221.     bne    2b
  1222.  
  1223.  
  1224.     move.w    (sp)+,d0    * とりあえず次元を書き込むことになっているが、
  1225.                 * 実は正の数なら何でも良い(7/5/3現在)
  1226.     pea.l    引数INIT
  1227.     bsr    buf書込        * d1.w/a0-a1 破壊
  1228.     not.w    d2
  1229.     move.w    d2,d0            * 変数番号
  1230.     bsr    buf書込        * d1.w/a0-a1 破壊
  1231.     addq.l    #4,sp
  1232.     rts
  1233.  
  1234.  
  1235.  
  1236. 変数引き数登録:
  1237.     btst    #0,d2
  1238.     bne    float引き数
  1239.     btst    #1,d2
  1240.     bne    int引き数
  1241.     btst    #2,d2
  1242.     bne    char引き数
  1243.     btst    #3,d2
  1244.     bne    str引き数
  1245.     bra    sonnahazunai
  1246.  
  1247. float引き数:
  1248.     lea.l    AUTOfloat,a0
  1249.     move.w    #$8080,d0
  1250.     bra    @f
  1251. char引き数:
  1252.     lea.l    AUTOchar,a0
  1253.     move.w    #$8002,d0
  1254.     bra    @f
  1255. str引き数:
  1256.     lea.l    AUTOstr,a0
  1257.     move.w    #$8001,d0
  1258.     bra    @f
  1259. int引き数:
  1260.     lea.l    AUTOint,a0
  1261.     move.w    #$8000,d0
  1262.  
  1263. @@:
  1264.     move.w    d0,-(sp)
  1265.     bsr    普通変数登録
  1266.  
  1267.     move.w    (sp)+,d0        * 型
  1268.     pea.l    引数INIT
  1269.     bsr    buf書込        * d1.w/a0-a1 破壊
  1270.     not.w    d2
  1271.     move.w    d2,d0            * 変数番号
  1272.     bsr    buf書込        * d1.w/a0-a1 破壊
  1273.     addq.l    #4,sp
  1274.     rts
  1275.  
  1276.  
  1277.  
  1278. sonnahazunai:
  1279.     ERROR    2
  1280. nest_structure終わってない:
  1281.     ERROR    42
  1282. no_endfunc:
  1283.     ERROR    43
  1284.  
  1285.  
  1286.  
  1287.  
  1288.     .xdef    global変数リスト作成
  1289. global変数リスト作成:
  1290.     lea.l    変数int,a2
  1291.     bra    @f
  1292.  
  1293. auto変数リスト作成:
  1294.     lea.l    AUTOint,a2
  1295. @@:
  1296.     move.w    8+変数INIT,-(sp)
  1297.     pea.l    変数INIT
  1298.  
  1299.     moveq    #0,d5        * 変数領域のサイズ
  1300.     bsr    buf書込        * dummy
  1301.     bsr    buf書込        * dummy
  1302.  
  1303.     move.w    4+8*0(a2),d0        * intの型の変数の個数 - 1
  1304.     move.w    d0,d1
  1305.     addq.w    #1,d1
  1306.     lsl.w    #2,d1
  1307.     add.w    d1,d5
  1308.     bsr    buf書込
  1309.     move.w    4+8*1(a2),d0        * str
  1310.     move.w    d0,d1
  1311.     addq.w    #1,d1
  1312.     lsl.w    #8,d1
  1313.     add.w    d1,d5
  1314.     bsr    buf書込
  1315.     move.w    4+8*2(a2),d0        * char
  1316.     move.w    d0,d1
  1317.     addq.w    #1,d1
  1318.     add.w    d1,d5
  1319.     bsr    buf書込
  1320.     move.w    4+8*3(a2),d0        * float
  1321.     move.w    d0,d1
  1322.     addq.w    #1,d1
  1323.     lsl.w    #3,d1
  1324.     add.w    d1,d5
  1325.     bsr    buf書込
  1326.  
  1327.     movea.l    0+8*4(a2),a3        * 配列まとめ
  1328.     move.w    4+8*4(a2),d4
  1329.  
  1330.     move.w    d4,d0
  1331.     bsr    buf書込        * d1.w/a0-a1 破壊
  1332.     tst.w    d4
  1333.     bmi    変数INITdata処理終了
  1334.     moveq    #変数個数,d3
  1335. 変数INITdata処理loop:
  1336.     lea.l    8(a3),a2
  1337.  
  1338.     move.w    (a2)+,d0        * 型(上位バイト)
  1339.     move.w    (a2)+,d2        * 次元 - 1
  1340.     move.b    d2,d0
  1341.     ror.w    #8,d0            * 次元+型
  1342.     bsr    buf書込        * d1.w/a0-a1 破壊
  1343.  
  1344.     moveq    #4,d1
  1345.     tst.b    d0
  1346.     beq    3f
  1347.     bmi    2f
  1348.     subq.b    #1,d0
  1349.     beq    1f
  1350.     moveq    #1,d1
  1351.     bra    3f
  1352. 1:
  1353.     move.w    #$100,d1    * 上位ワードはクリア済み
  1354.     bra    3f
  1355. 2:
  1356.     moveq    #8,d1
  1357. 3:
  1358.  
  1359. @@:
  1360.     moveq    #0,d0
  1361.     move.w    (a2)+,d0    * 添え字の大きさ
  1362.     move.l    d1,tmp        * 保存(スタックをいじれないから)
  1363.     bsr    buf書込        * d1.w/a0-a1 破壊
  1364.     move.l    tmp,d1
  1365.     addq.l    #1,d0        * 要るはず
  1366.     FPACK    __LMUL
  1367.     move.l    d0,d1
  1368.     dbra    d2,@b
  1369.     add.l    d1,d5
  1370.  
  1371.     lea.l    $20(a3),a3
  1372.     subq.w    #1,d3
  1373.     dbeq    d4,変数INITdata処理loop
  1374.     bne    変数INITdata処理終了
  1375.     moveq    #変数個数,d3
  1376.     movea.l    (a3),a3
  1377.     dbra    d4,変数INITdata処理loop
  1378.  
  1379. 変数INITdata処理終了:
  1380. *    move.l    a0,変数INIT
  1381.     addq.l    #4,sp
  1382.  
  1383.     move.w    (sp)+,d1
  1384.     move.l    d5,d2        * この関数ブロックで使用する変数領域の大きさ
  1385.  
  1386.     movea.l    4+変数INIT,a3
  1387.     swap    d2
  1388.     addq.w    #1,d1
  1389.     bsr    bufput
  1390.     swap    d2
  1391.     addq.w    #1,d1
  1392.     bsr    bufput
  1393.  
  1394.     rts
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409. **    **    **
  1410.  *    ネスト構造を持つステートメントの処理
  1411.  
  1412.  
  1413.  
  1414.  * nest 登録
  1415.  * d2.w = 登録する種類
  1416.  *    $0000 = for
  1417.  *    $ffff = while
  1418.  *    $0001 = switch
  1419.  *    $0011 = switch (default の後)
  1420.  *    $0002 = repeat
  1421.  *    $0003 = if
  1422.  *    $0004 = switch(str)
  1423.  *    $0014 = switch(str) (default の後)
  1424. nest登録:
  1425.  *    a3 = 書き込みアドレス
  1426.     movea.l    nest_work,a3
  1427.     move.l    (a3),d0
  1428.     beq    @f
  1429.     exg    a3,d0        * a3 = 今のブロックのポインタ
  1430.                 * d0 = 前のブロックのポインタ ( first block なら 0 )
  1431. @@:
  1432.     move.l    a3,nest_work
  1433.     addq.l    #4,a3        * つぎ
  1434.     move.l    d0,(a3)+    * まえ
  1435.     move.w    d2,(a3)+    * 種類
  1436.     rts
  1437.  
  1438.  * nest 
  1439. nest削除:
  1440.     movea.l    nest_work,a0
  1441.     tst.l    4(a0)
  1442.     beq    @f
  1443.     move.l    4(a0),nest_work        * 前のブロックを指すアドレス
  1444.     rts
  1445. @@:
  1446.     clr.l    (a0)
  1447.     rts
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455. Switch:
  1456.     move.w    d2,(a4)+    * 中間言語書き込み
  1457.  
  1458.     movea.l    a4,a3
  1459.     moveq    #-1,d2
  1460.     bsr    math解釈
  1461.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  1462.  * int        d6.w    = 0000
  1463.  * str        d6.w    = 0100
  1464.  * char     d6.w    = 0200
  1465.  * float    d6.w    = 8000
  1466.  
  1467.     moveq    #1,d2
  1468.  *    $0001 = switch
  1469.     cmpi.w    #$0100,d6        * str
  1470.     bne    @f
  1471.  
  1472. Switch2:
  1473.     move.w    #13*2,-2(a4)    * 中間言語書き込み $$$13='Endswitch'='Switch2'
  1474.     moveq    #4,d2
  1475.  *    $0004 = switch(str)
  1476.  
  1477. @@:
  1478.     movea.l    a3,a4
  1479.  * nest 登録
  1480.  * d2.w = 登録する種類
  1481.     bsr    nest登録
  1482.  *    a3 = 書き込みアドレス
  1483.  
  1484.     move.l    a4,(a3)+    * 飛び先を書くアドレス ( case default のリストがあるんだよ )
  1485.     addq.l    #4,a4
  1486.  
  1487.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1488.     move.l    a3,(a0)
  1489.  
  1490.     rts
  1491.  
  1492.  
  1493.  
  1494.  
  1495.  
  1496. Case:
  1497.     movea.l    nest_work,a0
  1498.     move.l    (a0),d0
  1499.     beq    no_nest_structure
  1500.  
  1501.     movea.l    d0,a3
  1502.     move.l    a4,d0
  1503.     bset    #$1d,d0        * CASE :
  1504.     move.l    d0,(a3)+    * case address
  1505.  
  1506.  *    $0001 = switch
  1507.  *    $0004 = switch(str)
  1508.     move.w    8(a0),d1
  1509.     subq.w    #1,d1
  1510.     beq    @f
  1511.     subq.w    #3,d1
  1512.     beq    Case2
  1513.     bra    no_switch
  1514. @@:
  1515.     bsr    int定数get
  1516.     move.l    d0,(a3)+    * case value
  1517.  
  1518.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1519.     move.l    a3,(a0)
  1520.     rts
  1521.  
  1522.  * 文字列用
  1523. Case2:
  1524.     moveq    #-1,d1
  1525.     cmpi.b    #'"',(a5)+
  1526.     bne    case_str_err
  1527.     move.l    a3,-(sp)
  1528.     addq.l    #2,a3
  1529. @@:
  1530.     move.b    (a5)+,d0
  1531.     cmpi.b    #'"',d0
  1532.     bhi    1f
  1533.     beq    2f
  1534.     cmpi.b    #$20,d0
  1535.     bcs    case_str_err
  1536. 1:
  1537.     move.b    d0,(a3)+
  1538.     addq.w    #1,d1
  1539.     bra    @b
  1540. 2:
  1541.     clr.b    (a3)+        * 文字列終
  1542.     clr.b    (a3)+
  1543.     move.l    a3,d0
  1544.     bclr    #0,d0
  1545.     move.l    (sp)+,a3
  1546.     move.w    d1,(a3)        * 文字列長さ - 1
  1547.  
  1548.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1549.     move.l    d0,(a0)
  1550.  
  1551.     rts
  1552.  
  1553.  
  1554.  
  1555.  
  1556. Default:
  1557.     movea.l    nest_work,a0
  1558.     move.l    (a0),d0
  1559.     beq    no_nest_structure
  1560.  *    $0001 = switch
  1561.  *    $0004 = switch(str)
  1562.     move.w    8(a0),d1
  1563.     subq.w    #1,d1
  1564.     beq    @f
  1565.     subq.w    #3,d1
  1566.     bne    no_switch
  1567. @@:
  1568.  
  1569.     movea.l    d0,a3
  1570.     move.l    a4,d0
  1571.     clr.l    (a3)+        * default
  1572.     move.l    d0,(a3)+    * default address
  1573.  
  1574.     move.l    a3,(a0)        * ネストバッファの終端を登録
  1575.  
  1576.     rts
  1577.  
  1578.  
  1579.  
  1580.  
  1581.     .xdef    Endswitch
  1582. Endswitch:
  1583.     moveq    #8*2,d2        * 'break'$$$
  1584.     bsr    Break
  1585.  
  1586.     movea.l    nest_work,a0
  1587.     move.l    (a0),d2            * last address
  1588.     beq    no_nest_structure
  1589.     addq.l    #8,a0
  1590.  
  1591.  *    $0001 = switch
  1592.  *    $0004 = switch(str)
  1593.     move.w    (a0)+,d5
  1594.     subq.w    #1,d5
  1595.     beq    @f
  1596.     cmpi.w    #3,d5
  1597.     bne    no_switch
  1598. @@:
  1599.  * d5 = 0    int
  1600.  * d5 = 3    str
  1601.  
  1602.     move.l    a4,d0
  1603.     move.l    (a0)+,a3    * switch から 'menu' に飛ぶアドレスを書く所
  1604.     bsr    address書き込みa3
  1605.  
  1606.  
  1607.     move.l    a4,a2        * case の個数置き用アドレス保存
  1608.     addq.l    #2,a4
  1609.     moveq    #0,d3        * case の個数カウンタ (最上位BIT = default の後 flag)
  1610.     clr.l    -(sp)        * break 用 '番人'
  1611. endsw_loop:
  1612.     cmpa.l    d2,a0
  1613.     bcc    endsw_loop_end
  1614.  
  1615.     move.l    (a0)+,d0    * address ( <0:cont. ,  =0:default )
  1616.     bmi    cont_in_switch    * continue : あるはずない(if 内から払い下げとか)
  1617.     beq    es_default
  1618.     bclr    #$1d,d0        * CASE :
  1619.     bne    es_case
  1620.  
  1621.  * break
  1622.     move.l    d0,-(sp)
  1623.     bra    endsw_loop
  1624.  
  1625.  
  1626. es_case:
  1627.     addq.l    #1,d3
  1628.     bmi    after_default
  1629. *    move.w    #$0001,(a4)+    * case
  1630.     tst.w    d5
  1631.     bne    es_case_str
  1632.     move.l    (a0)+,(a4)+    * case value
  1633.     bsr    address書き込み
  1634.     bra    endsw_loop
  1635.  
  1636. es_case_str:
  1637.     move.w    (a0)+,d1    * 文字列長さ - 1
  1638.     move.w    d1,(a4)+
  1639.     addq.w    #1,d1
  1640.     lsr.w    #1,d1
  1641. @@:
  1642.     move.w    (a0)+,(a4)+
  1643.     dbra    d1,@b
  1644.     bsr    address書き込み
  1645.     bra    endsw_loop
  1646.  
  1647.  
  1648. es_default:
  1649.     bset    #31,d3
  1650.     bne    after_default
  1651.     move.l    (a0)+,d0    * default address
  1652. *    move.w    #$ffff,(a4)+    * default
  1653.     bsr    address書き込み
  1654.     bra    endsw_loop
  1655.  
  1656.  
  1657. endsw_loop_end:
  1658. *    clr.w    (a4)+        * switch 終わりだ
  1659.     subq.w    #1,d3
  1660.     bcs    no_case
  1661.     move.w    d3,(a2)        * case の個数 - 1
  1662.     tst.l    d3
  1663.     bmi    @f
  1664.     moveq    #4,d0
  1665.     move.l    d0,(a4)+    * default 無かった時、飛び先をendswitch の後に
  1666. @@:
  1667.     move.l    (sp)+,d0    * break address
  1668.     beq    @f
  1669.     movea.l    d0,a3
  1670.     move.l    a4,d0
  1671.     bsr    address書き込みa3    * 各 case の後などにある break の飛び先を書く
  1672.     bra    @b
  1673.  
  1674. @@:
  1675.     bsr    nest削除
  1676.  
  1677.     rts
  1678.  
  1679.  
  1680.  
  1681. no_switch:
  1682.     ERROR    47
  1683. after_default:
  1684.     ERROR    61
  1685. case_str_err:
  1686.     ERROR    31    * 式の型が違う
  1687. no_case:
  1688.     ERROR    48
  1689.  
  1690.  
  1691.  
  1692.  
  1693.  
  1694. Break:
  1695.     move.w    d2,(a4)+    * 中間言語書き込み
  1696.  
  1697.     movea.l    nest_work,a0
  1698.     move.l    (a0),d0
  1699.     beq    no_nest_structure
  1700.     movea.l    d0,a3
  1701.     move.l    a4,(a3)+
  1702.     move.l    a3,(a0)
  1703.     addq.l    #4,a4
  1704.     rts
  1705.  
  1706.  
  1707. Continue:
  1708.     move.w    d2,(a4)+    * 中間言語書き込み
  1709.  
  1710.     movea.l    nest_work,a0
  1711.     move.l    (a0),d0
  1712.     beq    no_nest_structure
  1713.  
  1714.     move.w    8(a0),d1
  1715.     cmpi.w    #1,d1            * 種類(switch)
  1716.     beq    cont_in_switch
  1717.     cmpi.w    #$11,d1            * 種類(switch)
  1718.     beq    cont_in_switch
  1719.  
  1720.     movea.l    d0,a3
  1721.     move.l    a4,d0
  1722.     neg.l    d0
  1723.     move.l    d0,(a3)+
  1724.     move.l    a3,(a0)
  1725.     addq.l    #4,a4
  1726.     rts
  1727.  
  1728. cont_in_switch:
  1729.     ERROR    46
  1730. no_nest_structure:
  1731.     ERROR    28
  1732.  
  1733.  
  1734.  
  1735.     .xdef    If
  1736. If:
  1737.     move.w    d2,(a4)+    * 中間言語書き込み
  1738.  
  1739.     movea.l    a4,a3
  1740.     moveq    #0,d2
  1741.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  1742.  * int        d2.w    = 0000
  1743.     bsr    math解釈
  1744.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  1745.  
  1746.     tst.w    (a4)        * =0 ... int演算子
  1747.     bne    1f
  1748.     move.w    2(a4),d2
  1749.     subi.w    #9*2,d2        * 9-14 : 関係演算子
  1750.     bcs    1f
  1751.     cmpi.w    #6*2,d2
  1752.     bcc    1f
  1753.     tst.b    4+1(a4)        * int 型
  1754.     bne    1f
  1755.     addi.w    #42*2,d2
  1756.     move.w    d2,-2(a4)    * 中間言語書き込み $$$(42-47)
  1757.  
  1758.     lsr.w    #1,d0
  1759.     subq.w    #2+1,d0
  1760. @@:
  1761.     move.w    4(a4),(a4)+
  1762.     dbra    d0,@b
  1763.     bra    2f
  1764.  
  1765. 1:
  1766.     movea.l    a3,a4
  1767. 2:
  1768.     moveq    #3,d2
  1769.  * nest 登録
  1770.  * d2.w = 登録する種類
  1771.  *    $0003 = if
  1772.     bsr    nest登録
  1773.  *    a3 = 書き込みアドレス
  1774.  
  1775.     lea.l    _then(pc),a2
  1776.     bsr    one_check
  1777.     bmi    err_if
  1778.  
  1779.     bsr    first_check_a5_in_line
  1780.  
  1781.     moveq    #0,d0
  1782.     cmpi.b    #'{',(a5)
  1783.     bne    @f
  1784.     moveq    #1,d0        * then_block_flag on
  1785.     addq.l    #1,a5
  1786. @@:
  1787.     move.w    d0,(a3)+    * flag
  1788.     move.l    a4,(a3)+    * label 1 を書くアドレス
  1789.     addq.l    #4,a4
  1790.  
  1791.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1792.     move.l    a3,(a0)
  1793.  
  1794.     move.b    #':',-(a5)    ** 姑息! **
  1795.  
  1796.     rts
  1797.  
  1798.  
  1799. _then:
  1800.     .dc.b    'then',0,0
  1801.  
  1802.  
  1803.  
  1804. err_if:
  1805.     ERROR    30
  1806. Then:
  1807. Else0:
  1808.     ERROR    29    * not exist 'if'
  1809.  
  1810.  
  1811.  
  1812.     .xdef    Else
  1813. Else:
  1814. *    move.w    d2,(a4)+    * 中間言語書き込み
  1815.     move.w    #40*2,(a4)+    * 中間言語書き込み 'else'$$$
  1816.  
  1817.     movea.l    nest_work,a0
  1818.     move.l    (a0),d0
  1819.     beq    Else0        * ネストバッファ空っぽ (村重さん)
  1820.     addq.l    #8,a0
  1821.     cmpi.w    #3,(a0)+        * 種類
  1822.     bne    Else0
  1823.  
  1824.     tst.w    (a0)
  1825.     bne    Else0    * else 二重に使うなんて! or
  1826.             * '{' に対応する '}' がないよ  thanks for 村重さん (H8/2/1)
  1827.  
  1828.     bsr    first_check_a5_in_line
  1829.  * 数字なら            d0 = 0
  1830.  * 行の終わりなら        d0 = -1
  1831.  * その他なら            d0 = そのキャラクタ
  1832.     moveq    #2,d1        * else
  1833.     cmpi.b    #'{',d0
  1834.     bne    @f
  1835.     moveq    #3,d1        * else_block_flag on
  1836.     addq.l    #1,a5
  1837. @@:
  1838.     move.w    d1,(a0)+        * flag
  1839.  
  1840.     move.l    a4,d1        * label 2 を書くアドレス
  1841.     movea.l    (a0),a4        * label 1 を書くアドレス
  1842.     move.l    d1,d0
  1843.     addq.l    #4,d0        * label 1
  1844.     bsr    address書き込み
  1845.  
  1846.     movea.l    d1,a4
  1847.     addq.l    #4,a4        * label 1
  1848.     move.l    d1,(a0)        * label 2 を書くアドレス
  1849.  
  1850.  
  1851.     move.b    #':',-(a5)    ** 姑息! **
  1852.     rts
  1853.  
  1854.  
  1855.  
  1856.  
  1857.     .xdef    If_end
  1858. If_end:
  1859.     movea.l    nest_work,a0
  1860.     movea.l    a0,a3
  1861.  
  1862.     move.l    (a0)+,d2    * 次のブロックアドレス(このブロックの最終アドレス)
  1863.     move.l    (a0)+,-(sp)    * 前のブロックのアドレス
  1864.  
  1865.     cmpi.w    #3,(a0)+    * if
  1866.     bne    Else0
  1867.     addq.l    #2,a0
  1868.  
  1869.     move.l    a4,d1    * 保存
  1870.     move.l    a4,d0    * 飛び先
  1871.     movea.l    (a0)+,a4    * label ? を書くアドレス
  1872.     bsr    address書き込み
  1873.     movea.l    d1,a4    * 復活
  1874.  
  1875.     sub.l    a0,d2
  1876.     beq    If_end_end
  1877.  
  1878.     lsr.w    #2,d2
  1879.     subq.w    #1,d2
  1880. @@:
  1881.     move.l    (a0)+,(a3)+        * break,continue の上のネストへの引き継ぎ
  1882.     dbra    d2,@b
  1883.  
  1884. If_end_end:
  1885.     move.l    (sp)+,d0
  1886.     beq    @f
  1887.     move.l    d0,nest_work        * 前のブロックのアドレス
  1888.     movea.l    d0,a0    * ネストものの終わりの決まり文句
  1889.     move.l    a3,(a0)
  1890.     rts
  1891.  
  1892. @@:
  1893.     move.l    nest_work,a0
  1894.     clr.l    (a0)        * ネスト構造無し
  1895.     rts
  1896.  
  1897.  
  1898.  
  1899.  
  1900.  
  1901.  
  1902.  
  1903.  
  1904.     .xdef    While
  1905. While:
  1906.     move.w    d2,(a4)+    * 中間言語書き込み
  1907.  
  1908.     moveq    #-1,d2
  1909.  * nest 登録
  1910.  * d2.w = 登録する種類
  1911.  *    $ffff = while
  1912.     bsr    nest登録
  1913.  *    a3 = 書き込みアドレス
  1914.  
  1915.  
  1916.     move.l    a3,-(sp)
  1917.     addq.l    #2,a3        * 長さ
  1918.  
  1919.  * 式 解釈
  1920.     moveq    #0,d2
  1921.  * int        d2.w    = 0000
  1922.     bsr    math解釈
  1923.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  1924.     move.l    (sp)+,a3
  1925.  
  1926.     lsr.w    #1,d0
  1927.     subq.w    #1,d0
  1928.     move.w    d0,(a3)+    * 長さ / 2 - 1
  1929. @@:
  1930.     move.w    (a3)+,(a4)+    * 式 コピー
  1931.     dbra    d0,@b
  1932.  
  1933.     addq.l    #4,a4
  1934.     move.l    a4,(a3)+    * label 2    ( loop address )
  1935.     lea.l    -4(a4),a0
  1936.     move.l    a0,(a3)+    * label 1 を書くアドレス    ( break address )
  1937.  
  1938.     movea.l    nest_work,a0
  1939.     move.l    a3,(a0)
  1940.  
  1941.     rts
  1942.  
  1943.  
  1944.  
  1945.  
  1946.  
  1947. For:
  1948.     move.w    d2,(a4)+    * 中間言語書き込み
  1949.  
  1950.     moveq    #0,d2
  1951.  * nest 登録
  1952.  * d2.w = 登録する種類
  1953.  *    $0000 = for
  1954.  *    $ffff = while
  1955.  *    $0001 = switch
  1956.  *    $0002 = repeat
  1957.  *    $0003 = if
  1958.     bsr    nest登録
  1959.  *    a3 = 書き込みアドレス
  1960.  
  1961.     bsr    hash
  1962.  * a2.l = 元の対象の開始アドレス
  1963.  * d4.l = (hash.w)(文字数-1)
  1964.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  1965.     tst.w    d4
  1966.     bmi    err_for
  1967.  *         d4.l = * (hash.w)(文字数-1)
  1968.  *         a2.l = 元の対象の開始アドレス
  1969.     move.l    a3,-(sp)
  1970.      bsr    variable_check
  1971.  * 重なってない        d2.l    = -1
  1972.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  1973.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  1974.  * d0 =   0 : 普通の変数
  1975.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  1976.  *    $80 : auto 変数
  1977.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  1978.  *     -1 : 当たりなし
  1979.     bge    @f
  1980.     bsr    未宣言をint_sub
  1981.     bra    for_1
  1982.  
  1983. @@:
  1984.     tst.l    d2
  1985.     bmi    misengen_var        * システム変数も含む
  1986.  
  1987.     tst.w    d2        * $0000 = int
  1988.     bne    型違い
  1989.  
  1990.     tst.b    d0
  1991.     bge    for_1
  1992.     swap    d2
  1993.     not.w    d2        * AUTO 変数
  1994.     swap    d2
  1995. for_1:
  1996.     move.l    (sp)+,a3
  1997.  
  1998.     cmpi.b    #'=',(a5)+
  1999.     bne    err_for
  2000.  
  2001.  * 式1解釈
  2002.     move.l    a3,-(sp)
  2003.     movea.l    a4,a3
  2004.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2005.  * int        d2.w    = 0000
  2006.     bsr    math解釈
  2007.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2008.  
  2009.     movea.l    a3,a4
  2010.     move.l    (sp)+,a3
  2011.  
  2012.     swap    d6        * 変数番号
  2013.     move.w    d6,(a4)+        * 中間言語書き込み
  2014.  
  2015.  
  2016.     bsr    first_check_a5_in_line
  2017.  * 数字なら            d0 = 0
  2018.  * 行の終わりなら        d0 = -1
  2019.  * その他なら            d0 = そのキャラクタ
  2020.     tst.w    d0
  2021.     ble    err_for
  2022.     cmpi.b    #'t',(a5)+
  2023.     bne    err_for
  2024.     cmpi.b    #'o',(a5)+
  2025.     bne    err_for
  2026.  
  2027.  
  2028.  
  2029.     move.l    a3,-(sp)
  2030.     addq.l    #2,a3        * 長さ
  2031.     move.w    d6,(a3)+    * int 変数番号
  2032.  
  2033.     movea.l    a4,a3
  2034.  * 式2解釈
  2035.     moveq    #0,d2
  2036.  * int        d2.w    = 0000
  2037.     bsr    math解釈
  2038.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2039.     move.l    (sp)+,a3
  2040.  
  2041.     cmpi.w    #$8000,(a4)    * int 定数
  2042.     beq    next2
  2043.  
  2044.     lsr.w    #1,d0
  2045.     move.w    d0,(a3)        * 長さ / 2
  2046.     addq.l    #4,a3
  2047.     subq.w    #1,d0        * 長さ / 2 - 1
  2048. @@:
  2049.     move.w    (a4)+,(a3)+    * 式2コピー
  2050.     dbra    d0,@b
  2051.     bra    for_3
  2052.  
  2053. next2:            * 終値が定数の時は特別
  2054.     clr.w    (a3)        * 長さ = 0 が特別の印
  2055.     addq.l    #4,a3
  2056.     addq.l    #2,a4
  2057.     move.l    (a4)+,(a3)+    * 式2(ロングワード定数)コピー
  2058.  
  2059.  
  2060. for_3:
  2061.     movea.l    a4,a0
  2062.     addq.l    #4,a4
  2063.     move.l    a4,(a3)+    * label 2    ( loop address )
  2064.     move.l    a0,(a3)+    * label 1 を書くアドレス    ( break address )
  2065.  
  2066.  
  2067.     movea.l    nest_work,a0
  2068.     move.l    a3,(a0)
  2069.  
  2070.     rts
  2071.  
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077. misengen_var:
  2078.     ERRORS    7
  2079. 型違い:
  2080.     ERRORS    26
  2081. err_for:
  2082.     ERROR    25    * for
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088. Repeat:
  2089.     moveq    #2,d2
  2090.  * nest 登録
  2091.  * d2.w = 登録する種類
  2092.  *    $0002 = repeat
  2093.     bsr    nest登録
  2094.  *    a3 = 書き込みアドレス
  2095.  
  2096.     move.l    a4,(a3)+    * label 2    ( loop address )
  2097.  
  2098.     movea.l    nest_work,a0
  2099.     move.l    a3,(a0)
  2100.  
  2101.     rts
  2102.  
  2103.  
  2104.  
  2105.  
  2106. Until:
  2107.     move.l    a4,d3            * label 3 (continue address)
  2108.  
  2109.     move.w    d2,(a4)+    * 中間言語書き込み
  2110.     movea.l    nest_work,a3
  2111.     move.l    (a3),d2            * 末尾アドレス
  2112.     beq    repeatない        * H8/2/1 thanks for 村重さん
  2113.     addq.l    #8,a3
  2114.     cmpi.w    #2,(a3)+
  2115.     bne    repeatない
  2116.  
  2117.  * 式1解釈
  2118.  
  2119.     movem.l    d2/d3/a3,-(sp)
  2120.     movea.l    a4,a3
  2121.     moveq    #0,d2
  2122.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2123.  * int        d2.w    = 0000
  2124.     bsr    math解釈
  2125.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2126.  
  2127.     movea.l    a3,a4
  2128.     movem.l    (sp)+,d2/d3/a3
  2129.  
  2130.  
  2131.     bra    Next飛込2
  2132.  
  2133.  
  2134.  
  2135.  
  2136. repeatない:
  2137.     ERROR    33
  2138.  
  2139.  
  2140.  
  2141.  
  2142. Endwhile:
  2143.     move.l    a4,d3            * label 3 (continue address)
  2144.  
  2145.     move.w    d2,(a4)+    * 中間言語書き込み
  2146.     movea.l    nest_work,a3
  2147.     move.l    (a3),d2            * 末尾アドレス
  2148.     beq    whileない        * H8/2/1 thanks for 村重さん
  2149.     addq.l    #8,a3
  2150.     cmpi.w    #$ffff,(a3)+
  2151.     beq    Next飛込
  2152. whileない:
  2153.     ERROR    32
  2154.  
  2155.  
  2156.  
  2157. Next:
  2158.     move.l    a4,d3            * label 3 (continue address)
  2159.  
  2160.     move.w    d2,(a4)+    * 中間言語書き込み
  2161.     movea.l    nest_work,a3
  2162.     move.l    (a3),d2            * 末尾アドレス
  2163.     beq    forない            * H8/2/1 thanks for 村重さん
  2164.     addq.l    #8,a3
  2165.     tst.w    (a3)+
  2166.     bne    forない
  2167. Next飛込:        * Endwhile と(ほぼ)共通の処理
  2168.     move.w    (a3)+,d0    * 式の長さ
  2169.     beq    Next特別
  2170. @@:
  2171.     move.w    (a3)+,(a4)+    * (変数番号、)式 コピー
  2172.     dbra    d0,@b
  2173.     bra    Next飛込2
  2174. Next特別:
  2175.     addq.w    #1*2,-2(a4)    * statement #$$$ = 'Next2' 終値定数用
  2176.     move.w    (a3)+,(a4)+    * 変数番号
  2177.     move.l    (a3)+,(a4)+    * 式 コピー
  2178.  
  2179. Next飛込2:
  2180.     move.l    (a3)+,d0        * loop address
  2181.     bsr    address書き込み
  2182.     move.l    a4,d1            * label 1 (break address)
  2183.  
  2184.     sub.l    a3,d2
  2185.     lsr.w    #2,d2
  2186.     subq.w    #1,d2
  2187.     bcs    next_out
  2188. next_loop:
  2189.     move.l    (a3)+,d0
  2190.     bge    next_label1
  2191.  * label 3
  2192.     neg.l    d0
  2193.     movea.l    d0,a4
  2194.     move.l    d3,d0
  2195.     bra    @f
  2196. next_label1:
  2197.     movea.l    d0,a4
  2198.     move.l    d1,d0
  2199. @@:
  2200.     bsr    address書き込み
  2201.  
  2202.     dbra    d2,next_loop
  2203. next_out:
  2204.     bsr    nest削除
  2205.     movea.l    d1,a4
  2206.     rts
  2207.  
  2208.  
  2209.  
  2210.  
  2211. address書き込み:
  2212.     sub.l    a4,d0
  2213.     move.l    d0,(a4)+
  2214.     rts
  2215. address書き込みa3:
  2216.     sub.l    a3,d0
  2217.     move.l    d0,(a3)+
  2218.     rts
  2219.  
  2220. forない:
  2221.     ERROR    27
  2222.  
  2223.  
  2224.  
  2225.  
  2226. **    **    **
  2227.  
  2228. Error:
  2229.     move.w    d2,(a4)+    * 中間言語書き込み
  2230.     cmpi.b    #'o',(a5)+
  2231.     bne    bunpo_err    * 手抜き
  2232.     move.b    (a5)+,d0
  2233.     cmpi.b    #'n',d0
  2234.     beq    @f
  2235.     cmpi.b    #'f',d0
  2236.     bne    bunpo_err    * 手抜き
  2237.     cmpi.b    #'f',(a5)+
  2238.     bne    bunpo_err    * 手抜き
  2239.     clr.w    (a4)+
  2240.     rts
  2241. @@:
  2242.     move.w    #-1,(a4)+
  2243.     rts
  2244.  
  2245. bunpo_err:
  2246.     ERROR    4
  2247.  
  2248.  
  2249. Beep:
  2250. Cls:
  2251. End:
  2252. Stop:
  2253.     move.w    d2,(a4)+    * 中間言語書き込み
  2254.     rts
  2255.  
  2256.  
  2257. Exit:
  2258.     cmpi.b    #'(',(a5)+
  2259.     bne    exit_err
  2260.  
  2261.     bsr    first_check_a5_in_line
  2262.     cmpi.b    #')',d0
  2263.     beq    no_exitcode
  2264.  
  2265.     move.w    d2,(a4)+    * 中間言語書き込み
  2266.  
  2267.     moveq    #0,d2
  2268.     movea.l    a4,a3
  2269.  * int        d2.w    = 0000
  2270.     bsr    math解釈
  2271.     movea.l    a3,a4
  2272.  
  2273.     cmpi.b    #')',(a5)+
  2274.     bne    exit_err
  2275.     rts
  2276.  
  2277. no_exitcode:
  2278.     addq.l    #1,a5
  2279.     move.w    #19*2,(a4)+    * 中間言語書き込み (end) $$$
  2280.     rts
  2281.  
  2282. exit_err:
  2283.     ERROR    62
  2284.  
  2285.  
  2286.  
  2287. **    **    **
  2288.  
  2289.  
  2290. Key:
  2291.     bsr    fnc書替sub
  2292.     move.w    d2,(a4)+    * 中間言語書き込み
  2293.     movea.l    a4,a3
  2294.     moveq    #0,d2        * int
  2295.     bsr    math解釈
  2296.     cmpi.b    #',',(a5)+
  2297.     bne    key_err
  2298.     move.w    #$0100,d2    * str
  2299.     bsr    math解釈
  2300.     movea.l    a3,a4
  2301.     rts
  2302. key_err:
  2303.     ERROR    63
  2304.  
  2305.  
  2306. Color:
  2307.     bsr    first_check_a5_in_line
  2308.  * 数字なら            d0 = 0
  2309.  * 行の終わりなら        d0 = -1
  2310.  * その他なら            d0 = そのキャラクタ
  2311.     cmpi.b    #'[',d0
  2312.     beq    Color_Palet
  2313. Width:
  2314.     move.w    d2,(a4)+    * 中間言語書き込み
  2315.     moveq    #1-1,d2
  2316.     bsr    d2_int_para
  2317.     rts
  2318.  
  2319.  
  2320. Color_Palet:
  2321.     move.w    #35*2,(a4)+    * 中間言語書き込み 35= 'color[' $$$
  2322.     moveq    #4-1,d2
  2323.     addq.l    #1,a5
  2324.     bra    @f
  2325. Color_Palet_loop:
  2326.     bsr    first_check_a5_in_line
  2327.     cmpi.b    #',',d0
  2328.     bne    @f
  2329.     addq.l    #1,a5
  2330. @@:
  2331.     bsr    first_check_a5_in_line
  2332.     cmpi.b    #',',d0
  2333.     beq    CP値無し
  2334.     cmpi.b    #']',d0
  2335.     bne    @f
  2336. CP値無し:
  2337.     move.w    #-1,(a4)+
  2338.     bra    Color_Palet_cont
  2339. @@:
  2340.     clr.w    (a4)+        * 値あり
  2341.     move.w    d2,-(sp)
  2342.     moveq    #0,d2
  2343.     movea.l    a4,a3
  2344.     bsr    math解釈
  2345.     movea.l    a3,a4
  2346.     move.w    (sp)+,d2
  2347. Color_Palet_cont:
  2348.     dbra    d2,Color_Palet_loop
  2349.     cmpi.b    #']',(a5)+
  2350.     bne    cp_err
  2351.     rts
  2352. cp_err:
  2353.     ERROR    23
  2354.  
  2355.  
  2356. Console:
  2357.     cmpi.b    #',',(a5)
  2358.     beq    Console_para12_略
  2359.  
  2360.     lea.l    tmp,a3
  2361.     move.w    d2,(a3)+    * 中間言語書き込み
  2362.     moveq    #0,d2
  2363.     bsr    math解釈
  2364.  
  2365.     cmpi.b    #',',(a5)+
  2366.     bne    Console_para_err
  2367.     moveq    #0,d2
  2368.     bsr    math解釈
  2369.  
  2370.     move.l    a3,-(sp)
  2371.     bsr    Console_func
  2372.     move.l    (sp)+,d0
  2373.  
  2374.     lea.l    tmp,a0        * 第1・2パラメータを後から書き込む
  2375.     sub.l    a0,d0
  2376.     lsr.w    #1,d0
  2377.     subq.w    #1,d0
  2378. @@:
  2379.     move.w    (a0)+,(a4)+
  2380.     dbra    d0,@b
  2381.     rts
  2382.  
  2383.  
  2384. Console_para12_略:
  2385.     addq.l    #1,a5
  2386.     bsr    first_check_a5_in_line
  2387. Console_func:
  2388.     cmpi.b    #',',(a5)+
  2389.     bne    Console_para_err
  2390.  
  2391.     move.w    #36*2,(a4)+    * 中間言語書き込み 36= 'function on/off' $$$
  2392.     moveq    #1-1,d2
  2393.     bsr    d2_int_para
  2394.     rts
  2395.  
  2396. Console_para_err:
  2397.     ERROR    53
  2398.  
  2399.  
  2400. Screen:
  2401.     move.w    d2,(a4)+    * 中間言語書き込み
  2402.     moveq    #4-1,d2
  2403.     bsr    d2_int_para
  2404.     rts
  2405.  
  2406.  
  2407. Locate:
  2408.     cmpi.b    #',',(a5)
  2409.     beq    cursorSWのみ
  2410.  
  2411.     move.w    d2,(a4)+    * 中間言語書き込み
  2412.     moveq    #2-1,d2
  2413.     bsr    d2_int_para
  2414.     cmpi.b    #',',(a5)
  2415.     beq    cursorSW
  2416.     rts
  2417.  
  2418.  
  2419. cursorSWのみ:
  2420.     addq.l    #1,a5
  2421.     bsr    first_check_a5_in_line
  2422.     cmpi.b    #',',d0
  2423.     bne    para変
  2424. cursorSW:
  2425.     addq.l    #1,a5
  2426.     move.w    #37*2,(a4)+        * CursorSW $$$
  2427.  
  2428.     moveq    #0,d2
  2429.     movea.l    a4,a3
  2430.     bsr    math解釈
  2431.     movea.l    a3,a4
  2432.     rts
  2433.  
  2434.  
  2435.  
  2436.  
  2437.  
  2438. dip_loop:
  2439.     cmpi.b    #',',(a5)+
  2440.     bne    para変
  2441.  
  2442. d2_int_para:
  2443.     move.w    d2,-(sp)
  2444.  
  2445.     moveq    #0,d2
  2446.     movea.l    a4,a3
  2447.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2448.  * int        d2.w    = 0000
  2449.     bsr    math解釈
  2450.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2451.  * int        d6.w    = 0000
  2452.     movea.l    a3,a4
  2453.  
  2454.     move.w    (sp)+,d2
  2455.     dbra    d2,dip_loop
  2456.     rts
  2457.  
  2458. para変:
  2459.     ERROR    22
  2460.  
  2461.  
  2462.  
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470. **    **    **
  2471.  
  2472.  
  2473.  
  2474.  
  2475.  
  2476.  
  2477. CrLfEnd        equ    0
  2478. NoCrLfEnd    equ    2
  2479. TabJump        equ    4
  2480. UsingNum    equ    6
  2481. UsingStr    equ    8
  2482.  
  2483.     .xdef    Lprint
  2484. Lprint:
  2485. Print:
  2486.     move.w    d2,(a4)+    * 中間言語書き込み
  2487.  
  2488.     bsr    first_check_a5_in_line
  2489.     lea.l    _using(pc),a2
  2490.     bsr    one_check
  2491.     beq    PrintUsing
  2492.  
  2493. pr_loop:
  2494.     bsr    first_check_a5_in_line
  2495.  * 数字なら            d0 = 0
  2496.  * 行の終わりなら        d0 = -1
  2497.  * その他なら            d0 = そのキャラクタ
  2498.     tst.b    d0
  2499.     bmi    pr_crlf_end
  2500.     beq    pr_main
  2501.     cmpi.b    #'}',d0
  2502.     beq    pr_crlf_end
  2503.     cmpi.b    #':',d0
  2504.     bhi    pr_0
  2505.     beq    pr_crlf_end
  2506.     cmpi.b    #'/',d0
  2507.     bne    @f
  2508.     cmpi.b    #'*',1(a5)
  2509.     beq    pr_crlf_end
  2510. @@:
  2511.     cmpi.b    #',',d0
  2512.     beq    pr_1
  2513.     bra    pr_main
  2514.  
  2515. pr_0:
  2516.     cmpi.b    #';',d0
  2517.     beq    pr_2
  2518.  
  2519.  * else があるかどうかチェック
  2520.  * eq = ある , ne = ない
  2521.     bsr    else_check
  2522.     beq    pr_crlf_end
  2523.  
  2524.  
  2525. pr_main:
  2526.     moveq    #-1,d2
  2527.     lea.l    2(a4),a3
  2528.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2529.  * 型未判明    d2.w    = ffff
  2530.     bsr    math解釈
  2531.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2532.  * int        d6.w    = 0000
  2533.  * str        d6.w    = 0100
  2534.  * char     d6.w    = 0200
  2535.  * float    d6.w    = 8000
  2536.  
  2537.     lsr.w    #8,d6
  2538.     bset    #15,d6        * 代入式の印、下位バイトは変数の型
  2539.     move.w    d6,(a4)+        * 中間言語書き込み
  2540.     add.l    d0,a4
  2541.  
  2542.     bra    pr_loop
  2543.  
  2544. pr_1:                * ','
  2545.     move.w    #TabJump,(a4)+
  2546.  
  2547. pr_2:                * ';'
  2548.     addq.l    #1,a5
  2549.     bsr    first_check_a5_in_line
  2550.  * 数字なら            d0 = 0
  2551.  * 行の終わりなら        d0 = -1
  2552.  * その他なら            d0 = そのキャラクタ
  2553.     tst.w    d0
  2554.     bmi    pr_not_crlf_end
  2555.     cmpi.b    #':',d0
  2556.     beq    pr_not_crlf_end
  2557.     cmpi.b    #'}',d0
  2558.     beq    pr_not_crlf_end
  2559.     cmpi.b    #'/',d0
  2560.     bne    @f
  2561.     cmpi.b    #'*',1(a5)
  2562.     beq    pr_not_crlf_end
  2563. @@:
  2564.  * else があるかどうかチェック
  2565.  * eq = ある , ne = ない
  2566.     bsr    else_check
  2567.     beq    pr_not_crlf_end
  2568.     bra    pr_loop
  2569.  
  2570. pr_not_crlf_end:
  2571.     move.w    #NoCrLfEnd,(a4)+
  2572.     rts
  2573. pr_crlf_end:
  2574. *    move.w    #CrLfEnd,(a4)+
  2575.     clr.w    (a4)+
  2576.     rts
  2577.  
  2578.  
  2579.  
  2580.  
  2581. PrintUsing:
  2582.     bsr    first_check_a5_in_line
  2583.     cmpi.b    #'"',(a5)+
  2584.     bne    using_format_err
  2585.     movea.l    a5,a2            * 引き数のフォーマット
  2586. @@:
  2587.     move.b    (a5)+,d0
  2588.     beq    using_format_err
  2589.     cmpi.b    #$a,d0
  2590.     beq    using_format_err
  2591.     cmpi.b    #'"',d0
  2592.     bne    @b
  2593.  
  2594.     moveq    #';',d2        * 最初の引き数の区切り記号
  2595.  
  2596.  
  2597. us_loop:
  2598.     bsr    us_sub
  2599.     move.w    _us(pc,d1.w),d1
  2600.     jmp    _us(pc,d1.w)
  2601. *    .dc.b    '_"#.+\*!&@',0
  2602. _us:
  2603.     .dc.w    us_mes-_us
  2604.     .dc.w    us_tosi-_us
  2605.     .dc.w    us_loop_end-_us
  2606.     .dc.w    us_num-_us
  2607.     .dc.w    us_period-_us
  2608.     .dc.w    us_plus-_us
  2609.     .dc.w    us_yen-_us
  2610.     .dc.w    us_ast-_us
  2611.     .dc.w    us_str1-_us
  2612.     .dc.w    us_str-_us
  2613.     .dc.w    us_str_all-_us
  2614.  
  2615. us_tosi:
  2616.     move.b    (a2)+,d0    * 素通し
  2617.     cmpi.b    #'"',d0
  2618.     beq    using_format_err
  2619.     cmpi.b    #$20,d0
  2620.     bcs    using_format_err
  2621.  
  2622.  
  2623.  * 普通の文字列の部分
  2624. us_mes:
  2625.     move.w    #$8001,(a4)+        * str 型
  2626.     move.w    #$8001,(a4)+        * 定数
  2627. us_mes_loop:
  2628.     move.b    d0,(a4)+
  2629.     bsr    us_sub
  2630.     subq.w    #2,d1
  2631.     bcs    us_mes_loop
  2632.     beq    us_素通し    * d1 = '_'
  2633.  * 何かのフォーマットがあっただ
  2634.     bsr    a4word境界        * 文字列の後始末
  2635.     subq.l    #1,a2
  2636.     bra    us_loop
  2637. us_素通し:
  2638.     move.b    (a2)+,d0
  2639.     cmpi.b    #'"',d0
  2640.     beq    using_format_err
  2641.     cmpi.b    #$20,d0
  2642.     bcc    us_mes_loop
  2643.     bra    using_format_err
  2644.  
  2645.  
  2646. us_str1:
  2647.     moveq    #1-1,d0
  2648.     bra    us_str0
  2649.  
  2650. us_str:
  2651.     moveq    #1-1,d0
  2652. @@:
  2653.     addq.w    #1,d0
  2654.     cmpi.b    #$20,(a2)+
  2655.     beq    @b
  2656.     cmpi.b    #'&',-1(a2)
  2657.     bne    using_format_err
  2658. us_str0:
  2659.     cmp.b    (a5)+,d2
  2660.     bne    using_format_err0
  2661.     move.w    #UsingStr,(a4)+        * 中間言語書き込み = 8
  2662.     move.w    d0,-(sp)
  2663.     bsr    us_str_sub
  2664.     move.w    (sp)+,(a4)+        * 長さ
  2665.     bra    us_loop
  2666.  
  2667. us_str_all:
  2668.     cmp.b    (a5)+,d2
  2669.     bne    using_format_err0
  2670.     move.w    #$8001,(a4)+        * str型の意
  2671.     bsr    us_str_sub
  2672.     bra    us_loop
  2673.  
  2674. us_str_sub:
  2675.     movea.l    a4,a3
  2676.     move.w    #$0100,d2
  2677.     move.l    a2,-(sp)
  2678.     bsr    math解釈
  2679.     move.l    (sp)+,a2
  2680.     moveq    #',',d2        * 次の引き数の区切り記号
  2681.     movea.l    a3,a4
  2682.     rts
  2683.  
  2684.  
  2685. us_ast:
  2686.     cmpi.b    #'*',(a2)+
  2687.     bne    using_format_err
  2688.     moveq    #$1,d4        * 前に*
  2689.     moveq    #2-1,d0
  2690.     cmpi.b    #'\',(a2)+
  2691.     bne    us_num1
  2692.     moveq    #$1+2,d4    * 前に¥*
  2693.     moveq    #3-1,d0
  2694.     bra    us_num0
  2695. us_yen:
  2696.     cmpi.b    #'\',(a2)+
  2697.     bne    using_format_err
  2698.     moveq    #$2,d4        * 前に¥
  2699.     moveq    #2-1,d0
  2700.     bra    us_num0
  2701. us_plus:
  2702.     moveq    #$10,d4        * 前にプラス
  2703.     moveq    #1-1,d0
  2704.     bra    us_num0
  2705.  * 数値のフォーマット '##.#'
  2706. us_period:
  2707.     cmpi.b    #'#',(a2)
  2708.     bne    us_mes        * .... とペリオドが並ぶとえげつないことに
  2709. us_num:
  2710.     moveq    #0,d4        * 数値のフォーマット指定用
  2711.     moveq    #-1,d0        * 前の桁の長さ用
  2712. us_num1:
  2713.     subq.l    #1,a2
  2714. us_num0:
  2715.     move.w    #UsingNum,(a4)+        * 中間言語書き込み = 6
  2716.  
  2717.     cmp.b    (a5)+,d2
  2718.     bne    using_format_err0
  2719.  
  2720.     move.l    a2,-(sp)
  2721.     movea.l    a4,a3
  2722.     move.w    #$8000,d2
  2723.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2724.  * float    d2.w    = 8000
  2725.     movem.w    d0/d4,-(sp)
  2726.     bsr    math解釈
  2727.     movem.w    (sp)+,d0/d4
  2728.  
  2729.     movea.l    a3,a4
  2730.     movea.l    (sp)+,a2
  2731.     moveq    #',',d2        * 次の引き数の区切り記号
  2732.  
  2733.     bsr    sharp_count
  2734.     move.w    d0,(a4)+    * 前の桁数
  2735.     cmpi.b    #',',(a2)
  2736.     bne    @f
  2737.     addq.l    #1,a2
  2738.     bset    #2,d4        * コンマ
  2739. @@:
  2740.     cmpi.b    #'.',(a2)
  2741.     bne    後ろの桁なし
  2742.     addq.l    #1,a2
  2743.     moveq    #-1,d0
  2744.     bsr    sharp_count
  2745.     move.w    d0,(a4)+    * 後ろの桁数
  2746.     bra    @f
  2747. 後ろの桁なし:
  2748.     move.w    #-1,(a4)+
  2749. @@:
  2750.     move.b    (a2),d0
  2751.     cmpi.b    #'+',d0
  2752.     beq    us_plus2
  2753.     cmpi.b    #'-',d0
  2754.     beq    us_minus
  2755.     cmpi.b    #'^',d0
  2756.     bne    us_format0
  2757.  
  2758. us_exp:
  2759.     moveq    #5-1,d1
  2760.     movea.l    a2,a0
  2761. @@:
  2762.     cmpi.b    #'^',(a0)+
  2763.     dbne    d1,@b
  2764.     bne    us_format0
  2765.     movea.l    a0,a2
  2766.     bset    #3,d4        * 指数表現
  2767.     bra    us_format0
  2768. us_plus2:
  2769.     bset    #5,d4        * 後ろ+
  2770.     bra    us_format
  2771. us_minus:
  2772.     bset    #6,d4        * 後ろ-
  2773. *    bra    us_format
  2774.  
  2775. us_format:
  2776.     addq.l    #1,a2
  2777. us_format0:
  2778.     move.w    d4,(a4)+
  2779.     bra    us_loop
  2780.  
  2781.  
  2782.  
  2783. us_loop_end:
  2784.     cmpi.b    #';',(a5)
  2785.     bne    pr_crlf_end
  2786.     addq.l    #1,a5
  2787.     bra    pr_not_crlf_end
  2788.  
  2789.  
  2790.  
  2791.  
  2792.  
  2793.  
  2794. sharp_count:
  2795.     addq.w    #1,d0
  2796.     cmpi.b    #'#',(a2)+
  2797.     beq    sharp_count
  2798.     subq.l    #1,a2
  2799.     rts
  2800.  
  2801.  
  2802. us_sub:
  2803.     move.b    (a2)+,d0
  2804.     beq    using_format_err
  2805.     lea.l    _us_check(pc),a0
  2806.     moveq    #0,d1
  2807. @@:
  2808.     addq.w    #2,d1
  2809.     move.b    (a0)+,d4
  2810.     beq    no_hit
  2811.     cmp.b    d4,d0
  2812.     bne    @b
  2813.     rts
  2814. no_hit:
  2815.     moveq    #0,d1
  2816.     rts
  2817.  
  2818.  
  2819. _us_check:
  2820.     .dc.b    '_"#.+\*!&@',0
  2821. _using:
  2822.     .dc.b    'using',0
  2823.     .even
  2824.  
  2825.  
  2826.  
  2827.  
  2828. using_format_err0:
  2829.     cmpi.b    #';',d2
  2830.     beq    using_no_semicolon
  2831. using_format_err:
  2832.     ERROR    51
  2833. using_no_semicolon:
  2834.     ERROR    52
  2835.  
  2836.  
  2837.  
  2838.  
  2839.  
  2840.  
  2841.  
  2842.  
  2843. a4word境界:
  2844.     clr.b    (a4)+
  2845.     clr.b    (a4)+
  2846.     move.l    a4,d0
  2847.     bclr    #0,d0
  2848.     movea.l    d0,a4
  2849.     rts
  2850.  
  2851.  
  2852.  
  2853.  
  2854. input_sub:
  2855.     bsr    fnc書替sub
  2856.     addq.l    #1,a5
  2857. @@:
  2858.     move.b    (a5)+,d0
  2859.     beq    linput_err
  2860.     cmpi.b    #'"',d0
  2861.     beq    @f
  2862.     cmpi.b    #$d,d0
  2863.     beq    linput_err
  2864.     cmpi.b    #$a,d0
  2865.     beq    linput_err
  2866.     move.b    d0,(a4)+
  2867.     bra    @b
  2868. @@:
  2869.     bsr    first_check_a5_in_line
  2870.     rts
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877. Input:
  2878.     move.w    d2,(a4)+    * 中間言語書き込み
  2879.  
  2880.     cmpi.b    #'"',(a5)
  2881.     bne    @f
  2882.     bsr    input_sub
  2883.  
  2884.     cmpi.b    #",",d0
  2885.     beq    inp111
  2886.     cmpi.b    #";",d0
  2887.     beq    inp111
  2888.     bra    input_err
  2889. @@:
  2890.     subq.l    #1,a5
  2891. inp111:
  2892.     bsr    a4word境界
  2893.  
  2894.  * 変数名ゲット
  2895. input_loop:
  2896.     addq.l    #1,a5
  2897.  
  2898.     bsr    first_check_a5_in_line        * 7/11/8 (thanks for 金子さん)
  2899.     bsr    hash
  2900.     tst.w    d4
  2901.     bmi    input_err
  2902.      bsr    variable_check
  2903.  * 重なってない        d2.l    = -1
  2904.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2905.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2906.  * d0 =   0 : 普通の変数
  2907.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2908.  *    $80 : auto 変数
  2909.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2910.  *     -1 : 当たりなし
  2911.     tst.l    d2
  2912.     bmi    misengen_var        * システム変数も含む
  2913.  
  2914.     btst    #0,d0
  2915.     bne    型違い
  2916.  
  2917.     swap    d2        * 変数番号
  2918.     tst.b    d0
  2919.     bge    @f
  2920.     not.w    d2        * AUTO 変数
  2921. @@:
  2922.  
  2923.     move.l    d2,(a4)+
  2924.  
  2925.     cmpi.b    #',',(a5)
  2926.     beq    input_loop
  2927.  
  2928.     move.w    #$00ff,(a4)+    * 終わりの印
  2929.  
  2930.     rts
  2931.  
  2932.  
  2933.  
  2934.  
  2935.  
  2936. Linput:
  2937.     move.w    d2,(a4)+    * 中間言語書き込み
  2938.  
  2939.     cmpi.b    #'"',(a5)
  2940.     bne    @f
  2941.     bsr    input_sub
  2942.  
  2943.     cmpi.b    #";",(a5)+
  2944.     bne    linput_err
  2945. @@:
  2946.     bsr    a4word境界
  2947.  
  2948.  
  2949.  * 文字列変数名ゲット
  2950.     bsr    first_check_a5_in_line        * 7/11/8 (thanks for 金子さん)
  2951.     bsr    hash
  2952.     tst.w    d4
  2953.     bmi    linput_err
  2954.      bsr    variable_check
  2955.  * 重なってない        d2.l    = -1
  2956.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2957.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2958.  * d0 =   0 : 普通の変数
  2959.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2960.  *    $80 : auto 変数
  2961.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2962.  *     -1 : 当たりなし
  2963.     tst.l    d2
  2964.     bmi    misengen_var        * システム変数も含む
  2965.  
  2966.     cmpi.w    #$0100,d2        * $0100 = str
  2967.     bne    型違い
  2968.     btst    #0,d0
  2969.     bne    型違い
  2970.  
  2971.     swap    d2        * 変数番号
  2972.     tst.b    d0
  2973.     bge    @f
  2974.     not.w    d2        * AUTO 変数
  2975. @@:
  2976.  
  2977.     move.w    d2,(a4)+
  2978.     rts
  2979.  
  2980.  
  2981.  
  2982.  
  2983. linput_err:
  2984. input_err:
  2985.     ERROR    55
  2986.  
  2987.  
  2988.  
  2989.  
  2990.  
  2991.  
  2992.  
  2993.  
  2994.  
  2995.  
  2996.  
  2997.  
  2998.  
  2999. **    **    **
  3000.  
  3001.  
  3002.  
  3003.  
  3004. _INT    equ    $00
  3005. _STR    equ    $01
  3006. _CHAR    equ    $02
  3007. _FLOAT    equ    $80
  3008.  
  3009.  
  3010.  * 型を得る(省略なら int )
  3011.     .xdef    型getS
  3012. 型getS:
  3013.  *         (INT,STR,CHAR,FLOAT)
  3014.  * d1.w  型を返す(  0,  2,   4,    6)
  3015.  * d0    = 0 省略せず
  3016.  *    = 1 省略
  3017.     bsr    first_check_a5_in_line
  3018.     tst.w    d0
  3019.     ble    dim_mis
  3020.  
  3021.     lea.l    _kata1(pc),a2
  3022.     moveq    #4-1,d1
  3023. @@:
  3024.  * (a2) と a5 からの文字列を見比べる。
  3025.  * 一致してかつ、後ろが英数字以外    zero
  3026.  * 不一致                non zero
  3027.  * a0,d0 : 破壊
  3028.  * a2    : $00 の後ろ(次の文字列)
  3029.     bsr    one_check
  3030.     dbeq    d1,@b
  3031.     beq    @f
  3032.     moveq    #0,d1
  3033.     moveq    #1,d0
  3034.     rts
  3035. @@:
  3036.     add.w    d1,d1
  3037.     eori.w    #6,d1
  3038.     moveq    #0,d0
  3039.     rts
  3040.  
  3041.  
  3042.  * 型を得る(省略なら int )
  3043.     .xdef    型get
  3044. 型get:
  3045.  * d0.w  型を返す(INT,STR,CHAR,FLOAT)
  3046.     bsr    first_check_a5_in_line
  3047.     tst.w    d0
  3048.     ble    dim_mis
  3049.  
  3050.     lea.l    _kata1(pc),a2
  3051.     lea.l    -2+_kata3(pc),a1
  3052.     moveq    #4-1,d1
  3053. @@:
  3054.  * (a2) と a5 からの文字列を見比べる。
  3055.  * 一致してかつ、後ろが英数字以外    zero
  3056.  * 不一致                non zero
  3057.  * a0,d0 : 破壊
  3058.  * a2    : $00 の後ろ(次の文字列)
  3059.     bsr    one_check
  3060.     addq.l    #2,a1
  3061.     dbeq    d1,@b
  3062.     bne    @f
  3063.     move.w    (a1),d0
  3064.     rts
  3065. @@:
  3066.     moveq    #0,d0
  3067.     rts
  3068. _kata1:
  3069.     .dc.b    'int',0
  3070.     .dc.b    'str',0
  3071.     .dc.b    'char',0
  3072.     .dc.b    'float',0
  3073.     .even
  3074. _kata3:
  3075.     .dc.w    _INT,_STR,_CHAR,_FLOAT
  3076. **    .dc.w    $0000,$0100,$0200,$8000
  3077.  
  3078.  
  3079.  
  3080.  
  3081.  
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.  
  3088.  
  3089.  
  3090. 普通変数登録:
  3091.     moveq    #3,d1        * 一項辺りのデータサイズ ( = 2^3 = 8 )
  3092. *    bsr    変数登録sub
  3093. *    rts
  3094.  
  3095. 変数登録sub:
  3096.     moveq    #変数個数,d3
  3097.     lsl.w    d1,d3        * 一つの鎖のサイズ(バイト)
  3098.  
  3099.     movea.l    (a0)+,a3
  3100.     addq.w    #1,(a0)            * 登録数を一つ増やす
  3101.     move.w    (a0),d2            * 変数番号
  3102.     beq    新たな鎖
  3103.  
  3104.     move.w    d2,d0
  3105. @@:
  3106.     sub.w    #変数個数,d0
  3107.     bls    @f
  3108.     adda.w    d3,a3
  3109.     movea.l    (a3),a3        * 次の鎖
  3110.     bra    @b
  3111.  
  3112. @@:
  3113.     moveq    #変数個数-1,d0
  3114.     and.w    d2,d0
  3115.     bne    2f
  3116.  
  3117.  
  3118. 新たな鎖:
  3119.     movea.l    a0,a1
  3120.     move.w    d3,d0
  3121.     addq.w    #4,d0        * 次の鎖へのポインタ用
  3122.     bsr    malloc
  3123.     exg    a0,a1
  3124.  
  3125.     tst.w    d2
  3126.     bne    1f
  3127.  
  3128.     movea.l    a1,a3        * 最初の鎖
  3129.     move.l    a3,-4(a0)
  3130.     bra    3f
  3131.  
  3132. 1:
  3133.     move.l    a1,(a3,d3.w)     * 次の鎖へのつなぎ
  3134.     movea.l    a1,a3        * 新たな登録アドレス
  3135.     moveq    #変数個数-1,d0
  3136.     and.w    d2,d0
  3137.  
  3138. 2:
  3139.     lsl.w    d1,d0
  3140.     adda.w    d0,a3        * 登録アドレス
  3141.  
  3142.  
  3143. 3:
  3144.     move.l    d4,(a3)+    * (hash.w)(文字数 - 1)
  3145. *    move.w    d4,-(sp)
  3146.     bsr    名前登録    * a2,d4 破壊
  3147.     move.l    a0,(a3)+    * 名前アドレス
  3148. *    move.w    (sp)+,d4
  3149.     move.w    -4-2(a3),d4    * 4クロック得
  3150.  
  3151.     tst.b    d7
  3152.     bge    @f
  3153.     not.w    d2        * AUTO
  3154. @@:
  3155.     rts
  3156.  
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162.  * 文字列の大きさの部分を飛ばす
  3163. str_size:
  3164.     subq.w    #_STR,d2    * str 型にサイズの指定ある?
  3165.     bne    @f
  3166.     cmpi.b    #'[',(a5)
  3167.     bne    @f
  3168.     addq.l    #1,a5
  3169.     bsr    int定数get
  3170.     bsr    first_check_a5_in_line
  3171.     cmpi.b    #']',(a5)+
  3172.     bne    var_def_err0
  3173. @@:
  3174.     rts
  3175.  
  3176.  
  3177.  
  3178.  
  3179.  
  3180.     .xdef    b_argc_def
  3181. b_argc_def:
  3182.     movem.l    d0-d7/a0-a5,-(sp)
  3183.  
  3184.     lea.l    _B_ARGC(pc),a5
  3185.     bsr    hash
  3186.     lea.l    変数int,a0
  3187.     bsr    普通変数登録    * 変数番号 0
  3188.  
  3189.     lea.l    _B_ARGV(pc),a5
  3190.     bsr    hash
  3191.     lea.l    配列,a0        * global
  3192.     moveq    #5,d1        * 一項辺りのデータサイズ ( = 2^5 = 32 )
  3193.     bsr    変数登録sub    * 配列番号 0
  3194.     move.w    #_STR*$100,(a3)+    * 型
  3195.     clr.l    (a3)        * '1 次元 - 1' + '添え字 0(変数領域大きさ計算用)'
  3196.  
  3197.  
  3198.     movem.l    (sp)+,d0-d7/a0-a5
  3199.     rts
  3200. _B_ARGC:
  3201.     .dc.b    'b_argc',0
  3202. _B_ARGV:
  3203.     .dc.b    'b_argv',0
  3204.     .even
  3205.  
  3206.  
  3207.     .xdef    未宣言をint_sub
  3208. 未宣言をint_sub:
  3209.     WARNS    59
  3210.  
  3211.     lea.l    変数int,a0
  3212.     tst.b    d7
  3213.     bge    @f
  3214.     lea.l    AUTOint,a0
  3215. @@:
  3216.     bsr    普通変数登録
  3217.     swap    d2
  3218.     clr.w    d2        * int
  3219.     rts
  3220.  
  3221.  
  3222.  
  3223. Int:
  3224.     move.w    #_INT,-(sp)
  3225.     lea.l    変数int,a0
  3226.     tst.b    d7
  3227.     bge    @f
  3228.     lea.l    AUTOint,a0
  3229. @@:    move.l    a0,-(sp)
  3230.     bsr    変数登録
  3231.     addq.l    #6,sp
  3232.     rts
  3233.  
  3234. Str:
  3235.     move.w    #_STR,-(sp)
  3236.     lea.l    変数str,a0
  3237.     tst.b    d7
  3238.     bge    @f
  3239.     lea.l    AUTOstr,a0
  3240. @@:    move.l    a0,-(sp)
  3241.     bsr    変数登録
  3242.     addq.l    #6,sp
  3243.     rts
  3244.  
  3245. Float:
  3246.     move.w    #_FLOAT,-(sp)
  3247.     lea.l    変数float,a0
  3248.     tst.b    d7
  3249.     bge    @f
  3250.     lea.l    AUTOfloat,a0
  3251. @@:    move.l    a0,-(sp)
  3252.     bsr    変数登録
  3253.     addq.l    #6,sp
  3254.     rts
  3255.  
  3256. Char:
  3257.     move.w    #_CHAR,-(sp)
  3258.     lea.l    変数char,a0
  3259.     tst.b    d7
  3260.     bge    @f
  3261.     lea.l    AUTOchar,a0
  3262. @@:    move.l    a0,-(sp)
  3263.     bsr    変数登録
  3264.     addq.l    #6,sp
  3265.     rts
  3266.  
  3267.  
  3268.     .xdef    Dim
  3269. Dim:
  3270.  * 型を得る(省略なら int )
  3271.     bsr    型get
  3272.  * d0.w  型を返す
  3273.     move.w    d0,-(sp)
  3274.     clr.l    -(sp)
  3275.     bsr    変数登録
  3276.     addq.l    #6,sp
  3277.     rts
  3278.  
  3279.  
  3280.  
  3281.  
  3282.  
  3283.  
  3284.  
  3285.  
  3286.  
  3287.  
  3288.  
  3289.  
  3290. 変数登録loop:
  3291.     addq.l    #1,a5
  3292.  
  3293. 変数登録:
  3294.     bsr    first_check_a5_in_line
  3295.  * 数字なら            d0 = 0
  3296.  * 行の終わりなら        d0 = -1
  3297.  * その他なら            d0 = そのキャラクタ
  3298.     tst.w    d0
  3299.     ble    var_def_err0    * 数字や行末なら当然駄目だ (hash計算前 H8/2/1)
  3300.  
  3301.  
  3302.  * ハッシュ値を計算しながら、文字数を数える
  3303.     bsr    hash
  3304.  * a2.l = 元の対象の開始アドレス
  3305.  * d4.l = (hash.w)(文字数-1)
  3306.  * d1.b = お次の文字 ( ,: )
  3307.     tst.w    d4
  3308.     bmi    var_def_err
  3309.  
  3310.  * 対象がステートメント、関数と一致しないかどうか
  3311.     bsr    statement_check
  3312.  * 一致すれば        d0 = そのステートメント番号
  3313.  * 一致しなければ    d0 = 0
  3314.     tst.w    d0
  3315.     bne    var_def_err
  3316.  
  3317.  *        d4.l = * (hash.w)(文字数-1)
  3318.  *        a2.l = 元の対象の開始アドレス
  3319.     bsr    function_check
  3320.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  3321.     tst.w    d0
  3322.     bne    var_double_def_err    * 関数と同じ名前
  3323.  
  3324.  
  3325.  * 他の変数名と重なってないかどうか
  3326.  *         d4.l = * (hash.w)(文字数-1)
  3327.  *         a2.l = 元の対象の開始アドレス
  3328.      bsr    variable_check
  3329.     bmi    @f
  3330.     tst.b    d7
  3331.     bpl    var_double_def_err
  3332.     tst.b    d0
  3333.     bmi    var_double_def_err
  3334. @@:
  3335.  
  3336.  
  3337.     cmpi.b    #'(',(a5)    * 配列 ?
  3338.     bne    normal_var_def
  3339.  
  3340.  
  3341.  * 配列の登録だ
  3342.     tst.l    4(sp)        * 登録ハンドル
  3343.     beq    @f
  3344.     WARNS    11
  3345. @@:
  3346.  
  3347.     lea.l    配列,a0
  3348.     tst.b    d7
  3349.     bpl    @f
  3350.     lea.l    AUTO配列,a0
  3351. @@:
  3352.     moveq    #5,d1        * 一項辺りのデータサイズ ( = 2^5 = 32 )
  3353.     bsr    変数登録sub
  3354.  
  3355.     move.w 8(sp),d0
  3356.     lsl.w    #8,d0
  3357.     move.w    d0,(a3)+        * 型
  3358.     move.w    d2,-(sp)    * 配列番号保存
  3359.  
  3360.     move.l    a3,-(sp)
  3361.     addq.l    #2,a3            * 次元用に空けておく
  3362.     moveq    #-1,d2
  3363.  
  3364.     moveq    #1,d1
  3365.     movea.l    a3,a2        * 役割交代
  3366.     lea.l    tmp,a3
  3367.     bclr    #localF,d7    * 添字の大きさに非定数があったかいな
  3368. soeji_loop:
  3369.     addq.l    #1,a5
  3370.  
  3371.     movea.l    a3,a1
  3372.     movem.l    d1-d6/a1-a2,-(sp)
  3373.     moveq    #0,d2
  3374.     bsr    math解釈    * math解釈の最適化を利用
  3375.     movem.l    (sp)+,d1-d6/a1-a2
  3376.  
  3377.     cmpi.w    #$80_00,(a1)+
  3378.     beq    添字の大きさは定数だ
  3379.         bset    #localF,d7    * 添字の大きさに非定数があったんや
  3380.         moveq    #0,d0        * いらないけど一応
  3381.         bra    @f
  3382. 添字の大きさは定数だ:
  3383.     move.l    (a1),d0
  3384. @@:
  3385.  
  3386.     cmpi.l    #$10000,d0
  3387.     bcc    dim_mis
  3388.     addq.w    #1,d2        * 次元勘定
  3389.     cmpi.w    #10,d2
  3390.     bcc    dim_ten_err    * 10次元まで
  3391.     move.w    d0,(a2)+    * 添え字
  3392.  
  3393.     addq.l    #1,d0
  3394.     FPACK    __LMUL
  3395.     move.l    d0,d1        * 配列データ部のサイズ(要素の個数全体)の計算
  3396.  
  3397.     bsr    first_check_a5_in_line
  3398.     cmpi.b    #',',d0
  3399.     beq    soeji_loop
  3400.  * 添字の大きさの解釈終わり
  3401.  
  3402.  * d1 = 配列データ部のサイズ(要素の個数全体)
  3403.     exg.l    a2,a3        * 役割また交代
  3404.     movea.l    (sp)+,a0    * 配列リストの '次元-1' を差すポインタ
  3405.     move.w    d2,(a0)+    * 次元 - 1
  3406.  
  3407.     btst    #localF,d7
  3408.     beq    添字の大きさは定数ばかりだった
  3409.         btst    #len_dimF,d7
  3410.         beq    可変長配列は使えへん
  3411.         move.w    #34*2,(a4)+        * 配列初期化 statement $$$
  3412.         move.b    #$ff,(a4)+    * 中間言語書き込み : 可変長配列の定義
  3413.         move.w    2+8(sp),d0    * 型
  3414.         move.b    d0,(a4)+    * 中間言語書き込み : 型
  3415.         move.w    (sp),(a4)+    * 中間言語書き込み : 配列番号
  3416.         bge    global可変長配列は使えへんねん
  3417.         move.w    d2,(a4)+    * 中間言語書き込み : 次元-1
  3418.     @@:
  3419.         clr.w    (a0)+        * 変数領域大きさ計算用に添字大きさクリア
  3420.         dbra    d2,@b
  3421.         lea.l    tmp,a0
  3422.         suba.l    a0,a2
  3423.         move.l    a2,d0
  3424.         lsr.w    #1,d0
  3425.         subq.w    #1,d0
  3426.     @@:
  3427.         move.w    (a0)+,(a4)+    * tmp に入れといた添字大きさ情報
  3428.         dbra    d0,@b
  3429.  
  3430. 添字の大きさは定数ばかりだった:
  3431.     bsr    first_check_a5_in_line
  3432.     cmpi.b    #')',(a5)+    * 配列の添え字
  3433.     bne    dim_mis
  3434.  
  3435.  
  3436.     move.w    2+8(sp),d2    * 型
  3437.     move.l    d1,-(sp)
  3438.     bsr    str_size
  3439.     move.l    (sp)+,d1
  3440.     move.w    (sp)+,d2    * 配列番号復帰
  3441.  
  3442.     bsr    first_check_a5_in_line
  3443.     cmpi.b    #'=',d0            * 初期値データある?
  3444.     bne    変数登録cont
  3445.  
  3446.     move.w    8(sp),d3    * 型
  3447. *    lsl.w    #8,d3
  3448.     bsr    dim_init_data
  3449.     bra    変数登録cont
  3450.  
  3451.  
  3452.  
  3453.  
  3454.  * 普通変数の登録だ
  3455. normal_var_def:
  3456.     movea.l    4(sp),a0        * 登録ハンドル
  3457.     move.l    a0,d2
  3458.     beq    dim_mis
  3459.     bsr    普通変数登録
  3460.  
  3461.     move.w    d2,-(sp)    * 変数番号
  3462.     move.w    2+8(sp),d2    * 型
  3463.     bsr    str_size
  3464.     move.w    (sp)+,d2    * 変数番号
  3465.  
  3466.     bsr    first_check_a5_in_line
  3467.     cmpi.b    #'=',(a5)    * 初期値がある?
  3468.     bne    変数登録cont
  3469.     addq.l    #1,a5
  3470.  
  3471.     move.w    d2,-(sp)    * 変数番号
  3472.     move.w    2+8(sp),d2    * 型
  3473.     bset    #15,d2        * 普通の代入
  3474.     move.w    d2,(a4)+    * 中間言語書き込み
  3475.  
  3476.     lsl.w    #8,d2
  3477.     movea.l    a4,a3
  3478.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  3479.  * 型未判明    d2.w    = ffff
  3480.     bsr    math解釈
  3481.     movea.l    a3,a4
  3482.  
  3483.     move.w    (sp)+,(a4)+    * 中間言語書き込み。変数番号。
  3484.  
  3485. 変数登録cont:
  3486.     cmpi.b    #',',(a5)    * 続きがある?
  3487.     beq    変数登録loop
  3488.     rts
  3489.  
  3490.  
  3491.  
  3492.  
  3493.  
  3494.  
  3495.  
  3496.  * 初期化データ
  3497.  *    d3 = 型
  3498.  *    d2 = 配列番号
  3499.  *    d1 = 添え字大きさ
  3500.     .xdef    dim_init_data
  3501. dim_init_data:
  3502.     addq.l    #1,a5
  3503.  
  3504.     move.w    #34*2,(a4)+        * 配列初期化 statement $$$
  3505.     move.w    d3,(a4)+    * 中間言語書き込み : 型
  3506.  
  3507.     move.w    d2,(a4)+    * 中間言語書き込み : 配列番号
  3508.  
  3509.     movea.l    a4,a3        * (初期化データの個数 - 1) を書き込むアドレス
  3510.     addq.l    #2,a4
  3511.  
  3512.     bsr    first_check_a5_in_line
  3513.     cmpi.b    #'{',d0
  3514.     bne    dim_mis
  3515.  
  3516.     moveq    #0,d2
  3517.  
  3518.  
  3519. did_loop:
  3520.     addq.l    #1,a5
  3521.     bsr    first_check_a5_remark
  3522.  
  3523.     cmpi.b    #1,d3
  3524.     bne    did_not_str
  3525.  
  3526.  
  3527. *did_str:
  3528.     cmpi.b    #'"',(a5)+
  3529.     bne    dim_mis
  3530. @@:
  3531.     move.b    (a5)+,d0
  3532.     beq    dim_mis
  3533.     cmpi.b    #'"',d0
  3534.     beq    @f
  3535.     move.b    d0,(a4)+
  3536.     bra    @b
  3537.  
  3538. @@:
  3539.     clr.b    (a4)+
  3540.     bra    did_cont
  3541.  
  3542.  
  3543. did_not_str:
  3544.     tst.b    d3
  3545.     beq    did_int
  3546.     bmi    did_float
  3547. *did_char:
  3548.     bsr    int定数get
  3549.     move.b    d0,(a4)+
  3550.     bra    did_cont
  3551. did_float:
  3552.     movem.w    d1/d2/d3,-(sp)
  3553.     movea.l    a5,a0
  3554.     FPACK    __VAL
  3555.     movea.l    a0,a5
  3556.     cmpi.b    #'#',(a5)    * 応急処置
  3557.     bne    @f
  3558.     addq.l    #1,a5
  3559. @@:
  3560.     move.l    d0,(a4)+
  3561.     move.l    d1,(a4)+
  3562.     movem.w    (sp)+,d1/d2/d3
  3563.     bra    did_cont
  3564. did_int:
  3565.     bsr    int定数get
  3566.     move.l    d0,(a4)+
  3567.  
  3568.  
  3569. did_cont:
  3570.     addq.w    #1,d2
  3571.  
  3572.     bsr    first_check_a5_remark
  3573.     cmpi.b    #',',d0
  3574.     beq    did_loop
  3575.  
  3576.     cmpi.b    #'}',(a5)+
  3577.     bne    dim_mis
  3578.  
  3579.     subq.w    #1,d2
  3580.     bcs    dim_mis
  3581.  
  3582.     cmp.w    d1,d2
  3583.     bhi    dim_mis
  3584.     move.w    d2,(a3)        * 初期化データの個数
  3585.  
  3586.     move.l    a4,d0
  3587.     addq.l    #1,d0
  3588.     andi.b    #$fe,d0
  3589.     movea.l    d0,a4        * ワード境界に補正
  3590.  
  3591.     rts
  3592.  
  3593.  
  3594.  
  3595.  
  3596.  
  3597.  
  3598. var_def_err0:        * hash値を計算する前はここ
  3599.     ERROR    5    * 宣言がおかしい
  3600. var_def_err:
  3601.     ERRORS    5    * 宣言がおかしい
  3602. var_double_def_err:
  3603.     ERRORS    6    * 二重に宣言するなんて
  3604. no_soeji:
  3605.     ERROR    35
  3606. dim_mis:
  3607.     ERROR    36
  3608. dim_ten_err:
  3609.     ERROR    60
  3610. 可変長配列は使えへん:
  3611.     ERROR    84
  3612. global可変長配列は使えへんねん:
  3613.     ERROR    85
  3614.  
  3615.  
  3616.  
  3617.  
  3618.  
  3619.     .end
  3620.  
  3621.